這一節將比較仔細的講述一個比較重要的知識,就是模型的保存和加載。我們都知道深度學習模型在訓練一些大數據集的時候往往需要很長的時間,如果這時候突然斷網了或者停電了,那訓練不就GG了嗎?如果我想再次使用這個模型,難道要重新來過?當然不。在Tensorflow2.0中官方提供了多種模型保存和加載的方式,我們可以訓練一定次數進行保存方便下次打開代碼時接着進行訓練,聽起來是不是十分方便呢?接下來讓我們來看一看具體的代碼實現部分,我們採用最簡單的MNIST數據集來演示模型保存和加載的過程。
一.模型簡單配置
1.導入相關庫。
from __future__ import absolute_import, division, print_function, unicode_literals
import os
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
2.讀取Mnist數據集。
(train_images,train_labels),(test_images,test_labels) = tf.keras.datasets.mnist.load_data()
3.選取部分數據集進行訓練快速訓練(這部分不是重點,因此簡單配置一下)。在這裏訓練圖像需要reshape成一維值,因爲我們前期並沒有經過卷積,而是直接傳入MLP(多層感知機)進行訓練。
train_labels = train_labels[:1000]
test_labels = test_labels[:1000]
train_images = train_images[:1000].reshape(-1,28*28)/255.0 #轉一維並歸一化
test_images = test_images[:1000].reshape(-1,28*28)/255.0 #轉一維並歸一化
4.搭建簡單的模型。這裏蠻提一下sparse_categorical_crossentropy損失函數和categorcial_crossentropy函數的差別,如果你的標籤label是純數字未經過one-hot編碼則用前者,如果經過one-hot編碼則用後者。
def creat_model():
model = tf.keras.models.Sequential([
layers.Dense(512,input_dim=784,activation='relu'),
layers.Dropout(0.2), #防過擬合
layers.Dense(10,activation='softmax')
])
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
return model
model = creat_model()
5.打印模型概要。
model.summary()
二.模型訓練參數自動保存
1.以 checkpoints 形式保存,我們可以用tf.keras.callbacks.ModelCheckpoint這個函數允許模型在訓練的過程中和訓練結束時回調保存的模型。我們首先要定義模型文件要保存的路徑,接着設置ModelCheckpoint一些相關參數,最後將將其作爲回調傳入模型進行訓練。
checkpoint_path = 'training_1/cp.ckpt' #模型保存路徑和名稱
checkpoint_dir = os.path.dirname(checkpoint_path) #取模型保存文件的目錄
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,save_weights_only=True,verbose=1) #只保存訓練參數
model.fit(train_images,train_labels,epochs=10,validation_split=0.2,callbacks=[cp_callback])
2.重新建立一個未訓練的模型,測試一下測試集的結果。
model = creat_model()
loss,acc = model.evaluate(test_images,test_labels,verbose=2)
print("Untrained model, accuracy: {:5.2f}%".format(100*acc))
可以看到模型未訓練時,分類效果很差。
3.將剛纔訓練的模型參數加載至新建立的未訓練模型中。這裏有一點注意的是,如果我們僅僅只是加載模型的參數,那我們這個模型必須要和保存參數的那個模型結構一模一樣纔可以。
model.load_weights(checkpoint_path) #加載訓練好的模型參數
loss,acc = model.evaluate(test_images,test_labels,verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
模型測試的結果正常,模型參數加載成功。
4.這裏我們還可以在函數中加入period設置checkpoint的頻數,規定它訓練多少次才保存一次參數,這裏設置爲5代表每5次epoch保存一次checkpoint文件。
5.我們還可以用latest_checkpoint函數得到最新保存的那個模型參數文件,並加載看看測試結果。
latest = tf.train.latest_checkpoint(checkpoint_dir)
model = creat_model()
model.load_weights(latest)
loss, acc = model.evaluate(test_images, test_labels, verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
從結果可以看出模型加載成功。
三.模型訓練參數手動保存
1.前面講的方法是基於模型訓練回調自動保存模型參數文件,自然的我們也可以通過手動的方式進行保存和加載,直接使用save_weights和load_weights函數即可。
model.save_weights('./checkpoints/my_checkpoint') #手動保存模型參數
model = creat_model()
model.load_weights('./checkpoints/my_checkpoint') #模型參數加載
loss,acc = model.evaluate(test_images,test_labels,verbose=2)
print("Restored model, accuracy: {:5.2f}%".format(100*acc))
從結果可以看出模型參數加載成功。
四.保存整個模型。
1.我們還可以通過save和load_model直接保存及加載h5形式的模型文件(如果沒有安裝h5的庫,可以參照前幾節內容進行安裝)。
model = creat_model()
model.fit(train_images,test_labels,epochs=20)
model.save('my_model.h5')
new_model = keras.models.load_model('my_model.h5')
以上就是這節內容,知道了怎麼保存和加載我們的模型之後,之後我們便可以更方便地訓練模型了。謝謝大家的觀看和支持!