一、保存、讀取說明
我們創建好模型之后需要保存模型,以方便后續對模型的讀取與調用,保存模型我們可能有下面三種需求:1、只保存模型權重參數;2、同時保存模型圖結構與權重參數;3、在訓練過程的檢查點保存模型數據。下面分別對這三種需求進行實現。
二、僅保存模型參數
僅保存模型參數可以用一下的API:
Model.save_weights(file_path) # 將文件保存到save_path
Model.load_weights(file_path) # 將文件讀取到save_path
注意:由於save_weights只是保存權重w、b的參數值,所以在加載時最好保證我們的模型結構和原來保存的模型結構是相同的,否則可能會報錯。.
模型在保存之后會有多個文件:
- index類型文件,在分布式計算中,索引文件會指示哪些權重存儲在哪個分片。
- checkpoint類型文件,檢查文件點包含: 一個或多個包含模型權重的分片
- 如果您只在一台機器上訓練模型,那么您將有一個帶有后綴的分片:.data-00000-of-00001
import tensorflow as tf import os # 讀取數據集 (train_images, train_labels), (test_images, test_labels) = tf.keras.datasets.fashion_mnist.load_data() # 數據集歸一化 train_images = train_images / 255 train_labels = train_labels / 255 # 進行數據的歸一化,加快計算的進程 # 創建模型結構 net_input=tf.keras.Input(shape=(28,28)) fl=tf.keras.layers.Flatten()(net_input)#調用input l1=tf.keras.layers.Dense(32,activation="relu")(fl) l2=tf.keras.layers.Dropout(0.5)(l1) net_output=tf.keras.layers.Dense(10,activation="softmax")(l2) # 創建模型類 model = tf.keras.Model(inputs=net_input, outputs=net_output) # 查看模型的結構 model.summary() # 模型編譯 model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss="sparse_categorical_crossentropy", metrics=['acc']) # 模型訓練 model.fit(train_images, train_labels, batch_size=50, epochs=5, validation_split=0.1) # 模型存放路徑 save_path = './save_weights/' model.save_weights(save_path) # 模型加載 model.load_weights(save_path) # # 定義一個與原模型結構不同的模型 # net_in=tf.keras.Input(shape=(748,)) # net_out=tf.keras.layers.Dense(10,activation="softmax")(net_in) # # # 用不同結構的模型讀取參數,這里會報錯 # model2=tf.keras.Model(inputs=net_in,outputs=net_out) # model2.load_weights(save_path)
三、同時保存結構與參數
Keras使用HDF5標准提供基本保存格式,出於我們的目的,可以將保存的模型視為單個二進制blob。
保存完整的模型非常有用,使我們可以在TensorFlow.js(HDF5, Saved Model) 中加載它們,然后在Web瀏覽器中訓練和運行它們,或者使用TensorFlow Lite(HDF5, Saved Model)將它們轉換為在移動設備上運行。
# 模型訓練 model.fit(train_images, train_labels, batch_size=50, epochs=5, validation_split=0.1) # 保存模型 model.save('net_model.h5') # 模型加載 new_model=tf.keras.models.load_model('net_model.h5')
四、在訓練過程的檢查點保存模型數據
在訓練過程的檢查點保存模型數據有兩個作用:1、我們可以保存訓練各個節點的數據,便於我們把訓練效果最好的節點的模型挑選出來。2、可以隨時先暫停訓練模型,當想要訓練時繼續訓練。
在訓練的檢查點保存模型需要用到tf.keras.callbacks.ModelCheckpoint()類,這個是一個回調類,可以以列表形式傳入到fit()方法的callbacks參數中。
回調中類,文件名以.ckpt作為后綴,如文件路徑'./checkpoint/train.ckpt',會在checkpoint生成三個文件,后綴與Model.save_weights()方法創建的文件后綴相同,意義也相同。以下為回調類的參數:
tf.keras.callbacks.ModelCheckpoint()
- filepath:string,保存模型文件的路徑。
- monitor:監控:要監控的數量。
- verbose詳細:詳細模式,0或1。
- save_best_only:如果save_best_only = True,則不會覆蓋根據監控數量的最新最佳模型。
- save_weights_only:如果為True,則只有模型的權重
保存(model.save_weights(filepath)),否則保存完整模型(model.save(filepath))。 - mode:{auto,min,max}之一。 如果save_best_only =
True,則根據監控數量的最大化或最小化來決定覆蓋當前保存文件。
對於val_acc,這應該是max,對於val_loss,這應該是min等。在自動模式下,從監控量的名稱自動推斷方向。 - period:檢查點之間的間隔(時期數)。
# 模型編譯 model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001), loss="sparse_categorical_crossentropy", metrics=['acc']) # 創建一個保存模型的回調函數,每5個周期保存一次權重 cp_callback = tf.keras.callbacks.ModelCheckpoint( filepath='./checkpoint/train.ckpt', verbose=1, save_weights_only=True, period=5 ) # 模型訓練 model.fit(train_images, train_labels, batch_size=50, epochs=5, validation_split=0.1, callbacks=[cp_callback]) # 加載模型 model.load_weights('./checkpoint/train.ckpt') # # 繼續訓練模型 # model.fit()
五、模型可訓練參數的提取
有時候我們需要查看模型的參數,但是模型參數的顯示有時候由於數據過多不能再控制台全部顯示,所以需要存放到文件來查看。以下是提取可訓練參數的方法:
# 參看可訓練參數 import numpy as np model.trainable_variables # 設置全部可訓練參數可打印,不然數據過多,有一部分會以省略號的形式顯示 np.set_printoptions(threshold=np.inf) # 可訓練參數保存到文件 with open('trainable.txt', mode='w',encoding = "utf-8") as f: for t_v in model.trainable_variables: f.writelines(str(t_v.name) + '\n') # 保存參數名字 f.writelines(str(t_v.shape) + '\n') # 保存參數形狀 f.writelines(str(t_v.numpy()) + '\n') # 保存參數數值
