TF2.0模型保存

概述

這是TF2.0入門筆記【TF2.0模型創建TF2.0模型訓練TF2.0模型保存】中最後一篇【TF2.0模型保存】,前兩篇分別介紹了模型的創建訓練,本篇將介紹模型的保存以及加載

模型保存及加載

事實上,tensorflow1.x和tensorflow2.0的模型保存略有差別,tensorflow1.x還有一個freeze_graph的步驟…。但是這裏就不做討論了,本篇僅以TF2.0作爲介紹。

import tensorflow as tf
import os
from tensorflow.keras.layers import Dense, Flatten, Conv2D
from tensorflow.keras import Sequential
from tensorflow.keras.models import load_model

model = Sequential()

model.add(Conv2D(32, 3, activation='relu', padding='same', input_shape=(28, 28, 1)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))

mnist = tf.keras.datasets.mnist

(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

x_train = x_train[..., tf.newaxis]
x_test  = x_test[..., tf.newaxis]

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

保存爲.h5格式

1、保存權重

保存方式可以通過callback保存,也可以在最後通過調用save_weights方法保存
1.1、通過callback保存

model_path = "./model"
model_name = "weight_callback.h5"
if not os.path.exists(model_path):
    os.mkdir(model_path)

model_file = os.path.join(model_path, model_name)
callback = tf.keras.callbacks.ModelCheckpoint(filepath=model_file,
                                              save_weights_only=True,
                                              verbose=1)

model.fit(x_train, y_train, epochs=1, callbacks=[callback])

1.2、在最後調用save_weights方法保存

model.save_weights('./model/weight_save.h5')

運行上面的兩個代碼,我們會得到以下兩個權重文件:
在這裏插入圖片描述

2、加載權重

接下來我們加載一下看看它們測試結果是不是一樣的。
注意:由於是我們保存的是模型的參數,所以我們加載的時候需要需要重新定義模型結構

model = Sequential()

model.add(Conv2D(32, 3, activation='relu', padding='same', input_shape=(28, 28, 1)))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(10, activation='softmax'))

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

2.1、加載使用callback方法保存的權重

model.load_weights('./model/weight_callback.h5')
model.evaluate(x_test,  y_test, verbose=2)

運行輸出:

10000/10000 - 2s - loss: 0.0644 - accuracy: 0.9781
[0.06437707488704472, 0.9781]

2.2、加載使用save_weights方法保存的權重

model.load_weights('./model/weight_save.h5')
model.evaluate(x_test,  y_test, verbose=2)

運行輸出:

10000/10000 - 2s - loss: 0.0644 - accuracy: 0.9781
[0.06437707488704472, 0.9781]

分析:我們可以看到,結果是一樣的

3、保存整個模型

保存整個模型跟保存權重一樣,也是兩種方法。
1、通過callback保存
這裏把save_weights_only改成False就可以了

model_path = "./model"
model_name = "model_callback.h5"
if not os.path.exists(model_path):
    os.mkdir(model_path)

model_file = os.path.join(model_path, model_name)
callback = tf.keras.callbacks.ModelCheckpoint(filepath=model_file,
                                              save_weights_only=False,
                                              verbose=1)

model.fit(x_train, y_train, epochs=1, callbacks=[callback])

2、在最後調用save方法保存

model.save('./model/model_save.h5')

運行上面的兩個代碼,我們會得到以下兩個模型文件:
在這裏插入圖片描述

4、加載模型

由於這次我們保存的是整個模型(包括參數),所以加載的時候不需要重新定義模型結構,只需要通過load_model讀取文件就可以了
4.1、加載使用callback方法保存的模型

model = load_model('./model/model_callback.h5')
model.evaluate(x_test,  y_test, verbose=2)

運行輸出:

10000/10000 - 2s - loss: 0.0602 - accuracy: 0.9814
[0.0602496856124606, 0.9814]

4.2、加載使用save方法保存的模型

model = load_model('./model/model_save.h5')
model.evaluate(x_test,  y_test, verbose=2)

運行輸出:

10000/10000 - 2s - loss: 0.0602 - accuracy: 0.9814
[0.0602496856124606, 0.9814]

保存爲tf格式

事實上,TF2.0已經不推薦或者說不支持將參數保存爲.ckpt格式了,這裏演示的也不能說是.ckpt格式,官方文檔稱之爲’tf’格式,如果你不指定是’h5’格式,那它就是’tf’格式。(個人不推薦使用這種方法,事實上這裏我也不太懂)

model_path = "./model"
model_name = "weight_callback.ckpt"
if not os.path.exists(model_path):
    os.mkdir(model_path)

model_file = os.path.join(model_path, model_name)
callback = tf.keras.callbacks.ModelCheckpoint(filepath=model_file,
                                              save_weights_only=True,
                                              verbose=1)

model.fit(x_train, y_train, epochs=1, callbacks=[callback])

運行得到以下文件:
這裏只要你文件名的後綴不是.h5(如果後綴不是.h5,那麼就會保存成’tf’格式,這時後綴已經變得不重要了,你甚至可以不要後綴),那麼保存之後你就會得到以下三個文件。在這裏插入圖片描述

model.load_weights('./model/weight_callback.ckpt')
model.evaluate(x_test,  y_test, verbose=2)

運行輸出:

10000/10000 - 2s - loss: 0.0637 - accuracy: 0.9789
[0.06373853980554267, 0.9789]

保存爲.pb格式(Saved Model)

1、保存成Saved Model

這裏也仍然有兩種方式將模型保存爲Saved Model格式。
1.1、通過callback保存
想要通過callback保存成Saved Model格式,必須要傳遞的是一個文件夾,而不是文件名,而且save_weights_only=False這個參數一定要設成False,不然就會保存爲之前說的’tf’格式,注意:這兩個條件缺一不可。

model_path = "./model"

if not os.path.exists(model_path):
    os.mkdir(model_path)

callback = tf.keras.callbacks.ModelCheckpoint(filepath=model_path,
                                              save_weights_only=False,
                                              verbose=1)

1.2、在最後用tf.saved_model.save方法保存

tf.saved_model.save(model, './model')

運行上面的兩個代碼,我們會得到以下文件(兩種方法運行結果一樣):
在這裏插入圖片描述

2、加載Saved Model

這裏你仍然可以簡單地通過load_model去加載Saved ModelSaved Model也是保存的是整個模型,但是Saved Model還有更多的用處,不過這裏就不深入介紹了(以後要是出TF2.0模型部署會詳細介紹)。

model = load_model('./model/')
model.evaluate(x_test,  y_test, verbose=2)

運行輸出:

10000/10000 - 2s - loss: 0.0663 - accuracy: 0.9790
[0.06630929337199777, 0.979]

完結撒花

TF2.0入門筆記【TF2.0模型創建TF2.0模型訓練TF2.0模型保存】三部曲

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章