1. 程式人生 > 實用技巧 >Tensorflow學習筆記No.9

Tensorflow學習筆記No.9

模型的儲存與恢復

介紹一些常見的模型儲存與恢復方法,以及如何使用回撥函式儲存模型。

1.儲存完整模型

model.save()方法可以儲存完整的模型,包括模型的架構、模型的權重以及優化器

model.save()的引數為儲存路徑以及檔名。

首先我們構建一個簡單的Sequential模型,使用fishion_mnist資料集進行訓練,得到一個訓練後的模型。

 1 import tensorflow as tf
 2 import numpy as np
 3 
 4 (train_image, train_label), (test_image, test_label) = tf.keras.datasets.fashion_mnist.load_data()
5 6 train_image = np.expand_dims(train_image, -1) 7 test_image = np.expand_dims(test_image, -1) 8 9 model = tf.keras.Sequential() 10 model.add(tf.keras.layers.Conv2D(32, [3, 3], input_shape = (28, 28, 1), activation = 'relu')) 11 model.add(tf.keras.layers.Conv2D(64, [3, 3], activation = 'relu'
)) 12 model.add(tf.keras.layers.GlobalAveragePooling2D()) 13 model.add(tf.keras.layers.Dense(64, activation = 'relu')) 14 model.add(tf.keras.layers.Dense(10, activation = 'softmax')) 15 16 model.compile(optimizer = 'adam', 17 loss = 'sparse_categorical_crossentropy', 18 metrics = ['
acc']) 19 20 history = model.fit(train_image, train_label, 21 epochs = 10, 22 validation_data = (test_image, test_label))

使用model.summary()檢視當前模型結構:

1 model.summary()

訓練完成後我們使用model.evaluate()方法對測試集進行評估。

1 model.evaluate(test_image, test_label)

正確率如下圖所示:

然後我們使用model.save()方法儲存完整模型。

1 model.save('model_1.h5')

儲存後我們會得到一個名為model_1.h5的檔案,這個檔案就是儲存好的模型。

儲存好的模型會放到指定位置。

我們可以使用tf.keras.models.load_model()方法來匯入我們儲存好的模型,引數為已儲存模型的儲存位置以及檔名。

1 new_model = tf.keras.models.load_model('model_1.h5')

我們使用.summary()方法檢視一下模型結構是否與之前相同。

1 new_model.summary()

可以發現模型結構是完全一致的。

然後我們使用.evaluate()方法對測試集進行評估,看一下模型權重是否被儲存。

1 new_model.evaluate(test_image, test_label)

可以發現,loss值與之前完全相同。

注意:這裡acc值發生了很嚴重的變化,目前不知道我還是什麼原因導致的,但這不代表我們儲存的模型或者是權重出現了問題,使用.predict()方法依然可以正常對資料進行分類預測,這是我使用.predict()方法預測後與原資料一一比對後確認過的,可能是出現了一個小bug,知道原因的小夥伴可以評論區回覆我。

重申:模型是已經正常儲存了的,是可以正常使用的,大家無需擔心,loss值足夠證明我們的模型是正常儲存的。

2.僅儲存模型結構

有時候我們可能不需要儲存模型的權重,而只想儲存模型的架構。

這時可以使用model.to_jison()來獲取模型架構。

1 json = model.to_json()

json中儲存了模型架構的完整資訊。

我們可以使用python的檔案操作方法將它寫入到磁碟上,使用時再從磁碟上讀入即可,這裡不詳細說明了,大家自行百度即可。

使用tf.keras.models.model_from_jsom()來恢復模型,引數為我們之前儲存模型資訊的變數json。

1 new_model = tf.keras.models.model_from_json(json)

同樣,我們檢視模型結構並對模型進行評估。

1 new_model.summary()

1 new_model.compile(optimizer = 'adam',
2               loss = 'sparse_categorical_crossentropy',
3               metrics = ['acc'])
4 
5 new_model.evaluate(test_image, test_label)

注意,由於我們沒有儲存優化器,所以要先對模型新增一個優化器再進行評估。

可以發現loss值非常的大,也就說明的模型沒有被訓練過,模型中的引數都是隨機產生的。

3.僅儲存模型權重

同樣的,我們也可以僅儲存模型權重。

權重的儲存有兩種方法,可以像上面儲存模型結構一樣使用model.get_weights()把模型結構讀入到變數中再進行儲存,也可以使用keras提供的方法直接儲存到磁碟上。

這裡主要介紹第二種(主要是第一種用處不大)。

使用model.save_weights()方法進行儲存,引數為儲存路徑以及檔名。

1 model.save_weights('weights_1.h5')

同樣,我們會得到一個對應的檔案。

然後使用.load_weigths()方法可以載入權重,引數為路徑及檔名。

1 new_model.load_weights('weights_1.h5')

對測試集進行評估檢視是否被正常載入。

1 new_model.evaluate(test_image, test_label)

loss值與之前相同,說明權重被正常載入了。

注意,儲存權重也不會儲存優化器,這裡不用重定義優化器是因為上面已經給new_model這個物件定義過優化器了。

4.使用回撥函式儲存模型

我覺得這是最實用也是最好的模型儲存方法。

首先定義一個回撥函式監測訓練過程並儲存模型。

使用tf.keras.callbacks.ModelCheckpoint()來定義這樣一個回撥函式。

它的主要引數為:

  filepath:儲存位置。

  moinitor = 'val_loss':監視的變數。

  verboss = 0:是否顯示詳細資訊。

  save_best_only = False:為True則會儲存loss最低的或者acc最高的。

  save_weihts_only = False:是否只儲存權重,為False會儲存整個模型。

1 checkpoint = tf.keras.callbacks.ModelCheckpoint('modelcp', 
2                                                 save_weights_only = True,
3                                                 save_best_only = True,
4                                                 verbose = 1)

然後我們構建模型訓練一下試試。

 1 new_model = tf.keras.models.model_from_json(json)
 2 
 3 new_model.compile(optimizer = 'adam',
 4               loss = 'sparse_categorical_crossentropy',
 5               metrics = ['acc'])
 6 
 7 history = new_model.fit(train_image, train_label,
 8                     epochs = 5,
 9                     validation_data = (test_image, test_label),
10                     callbacks = [checkpoint])

要在.fit()中加入callbacks引數呼叫回撥函式。

可以發現我們的模型資訊被儲存了,同時多出來三個儲存好的檔案。

同樣使用.load_weights()來載入權重,並進行評估。

1 new_model = tf.keras.models.model_from_json(json)
2 
3 new_model.compile(optimizer = 'adam',
4               loss = 'sparse_categorical_crossentropy',
5               metrics = ['acc'])
6 
7 new_model.load_weights('modelcp')
8 
9 new_model.evaluate(test_image, test_label)

得到結果:

與訓練時最後儲存的結果相同。

關於模型的儲存方法就介紹到這裡了,後續會更新更多內容哦!o(* ̄▽ ̄*)o