tensorflow 1.x Saver(保存与加载模型) 预测
20201231
tensorflow 1.X 模型保存
https://blog.csdn.net/qq_35290785/article/details/89646248
保存模型
saver=tf.train.Saver()
save_path=saver.save(sess,path+’\model\’+str(model_name)+‘model.ckpt’)
print(‘model save in file : {}’.format(save_path))
加載模型
with tf.Session() as sess:
new_saver = tf.train.import_meta_graph(path+’\model\’+str(model_name)+‘model.ckpt.meta’) #注意這里的后面有個meta后綴
new_saver.restore(sess, tf.train.latest_checkpoint(path+’\model\’))
加載預(yù)測
https://blog.csdn.net/luoyexuge/article/details/78209670
import tensorflow as tf
with tf.Session() as sess:new_saver=tf.train.import_meta_graph('/Users/shuubiasahi/Desktop/tensorflow/modelsave/model.ckpt-100.meta')new_saver.restore(sess,"/Users/shuubiasahi/Desktop/tensorflow/modelsave/model.ckpt-100")graph = tf.get_default_graph()x=graph.get_operation_by_name('x').outputs[0]y=tf.get_collection("pred_network")[0]print("109的預(yù)測值是:",sess.run(y, feed_dict={x: [[109]]}))
keras API 保存與加載
保存 Sequential 模型和 Functional 模型
建立用于實驗的模型
Sequential 模型和 Functional 模型保存方法相同,用Functional 模型演示
from tensorflow import keras
from tensorflow.keras import layers
#定義模型
inputs = keras.Input(shape=(784,), name=‘digits’)
x = layers.Dense(64, activation=‘relu’, name=‘dense_1’)(inputs)
x = layers.Dense(64, activation=‘relu’, name=‘dense_2’)(x)
outputs = layers.Dense(10, name=‘predictions’)(x)
model = keras.Model(inputs=inputs, outputs=outputs, name=‘3_layer_mlp’)
model.summary()
#訓(xùn)練模型
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape(60000, 784).astype(‘float32’) / 255
x_test = x_test.reshape(10000, 784).astype(‘float32’) / 255
model.compile(loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True),
optimizer=keras.optimizers.RMSprop())
history = model.fit(x_train, y_train,
batch_size=64,
epochs=1)
Model: “3_layer_mlp”
Layer (type) Output Shape Param #
digits (InputLayer) [(None, 784)] 0
dense_1 (Dense) (None, 64) 50240
dense_2 (Dense) (None, 64) 4160
predictions (Dense) (None, 10) 650
Total params: 55,050
Trainable params: 55,050
Non-trainable params: 0
Train on 60000 samples
60000/60000 [==============================] - 3s 42us/sample - loss: 0.3146
整個模型的保存與恢復(fù)
#保存模型
model.save(‘path_to_my_model.h5’)
#恢復(fù)模型
new_model = keras.models.load_model(‘path_to_my_model.h5’)
new_model.summary()
Model: “3_layer_mlp”
Layer (type) Output Shape Param #
digits (InputLayer) [(None, 784)] 0
dense_1 (Dense) (None, 64) 50240
dense_2 (Dense) (None, 64) 4160
predictions (Dense) (None, 10) 650
Total params: 55,050
Trainable params: 55,050
Non-trainable params: 0
當調(diào)用model.save方法時:
模型的結(jié)構(gòu)
模型的參數(shù)
模型的配置(compile里那些)
模型優(yōu)化器的相關(guān)參數(shù)
默認情況下都會被保存,save方法定義如下
save(
filepath, overwrite=True, include_optimizer=True, save_format=None,
signatures=None, options=None
)
filepath:字符串類型,保存路徑
overwrite: 是靜默覆蓋目標位置的任何現(xiàn)有文件,還是向用戶提供手動提示。
include_optimizer: 是否把優(yōu)化器內(nèi)參數(shù)也一并保存
save_format: 選填’tf’ 和’h5’其中一個, Tensorflow SavedModel 和 HDF5兩種類型. 默認是TF
signatures: 使用SavedModel保存的簽名。只適用于“tf”格式,詳情查看 tf.saved_model.save
options:可選參數(shù), tf.saved_model.SaveOptions 對象,該對象指定保存到SavedModel的選項。
tf.keras.models.load_model()方法:
tf.keras.models.load_model(
filepath, custom_objects=None, compile=True
)
filepath:加載路徑
custom_objects: 可選的字典將名稱(字符串)映射到在反序列化期間要考慮的自定義類或函數(shù)。
compile: 是否在加載模型后編譯模型
model.save()與new_model = keras.models.load_model()同樣可將模型導(dǎo)出為SavedModel格式
Export the model to a SavedModel
model.save(‘path_to_saved_model’, save_format=‘tf’)
Recreate the exact same model
new_model = keras.models.load_model(‘path_to_saved_model’)
SavedModel是TensorFlow對象的獨立序列化格式,由TensorFlow支持和實現(xiàn)。
只保存模型或只保存結(jié)構(gòu)
如果只想保存模型結(jié)構(gòu),而不想保存模型參數(shù),可以通過model.get_config()方法獲取模型的配置信息 , 模型的配置信息是Python dict類型 , 對于模型的恢復(fù)可以使用keras.Model.from_config(config)
config = model.get_config()
reinitialized_model = keras.Model.from_config(config)
模型的config信息也可以被保存為json字符串 , 此時應(yīng)該使用model.to_json()與keras.models.model_from_json() , 對模型進行提取和恢復(fù)
json_config = model.to_json()
reinitialized_model = keras.models.model_from_json(json_config)
將模型的結(jié)構(gòu)(配置信息)取到內(nèi)存以后 , 可以通過python方法將模型保存到硬盤:
json_config = model.to_json()
with open(‘model_config.json’, ‘w’) as json_file:
json_file.write(json_config)
如果只想保存權(quán)重信息可以使用get_weights()/set_weights()方法 , 對模型的權(quán)重進行提取和恢復(fù)
weights = model.get_weights()
model.set_weights(weights)
如果想將其保存在硬盤上,應(yīng)該用save_weights(fpath) 和 load_weights(fpath),代替 get_weights() 和 set_weights(weights)
model.save_weights方法 :
如果想將其保存在硬盤上,應(yīng)該用save_weights(fpath) 和 load_weights(fpath),代替 get_weights() 和 set_weights(weights)
model.save_weights方法 :
filepath: 字符串,文件路徑, .h5后綴將會使文件保存為HDF5格式
overwrite: 是靜默覆蓋目標位置的任何現(xiàn)有文件,還是向用戶提供手動提示。
save_format: 可選 tf 或者 h5 默認不填的話 , 根據(jù)文件路徑后綴判斷 , 否則默認 tf
無論是單獨保存參數(shù)還是單獨保存模型,無論哪種方式,都不會保存訓(xùn)練數(shù)據(jù)和優(yōu)化器參數(shù),所以新模型需要重新編譯。
子類模型的保存
子類模型的保存和上述類似但是要注意
從未使用過的模型無法被保存
如果使用model.save_weights保存參數(shù),恢復(fù)時,需要保證用子類創(chuàng)建一個相同類型的模型,并編譯(compile)相同的配置,且在 load_weights之前一定要先訓(xùn)練一些數(shù)據(jù)(為了自動創(chuàng)建層的大小與類型等操作)
在訓(xùn)練期間保存模型
可以使用訓(xùn)練好的模型而無需從頭開始重新訓(xùn)練,或在您打斷的地方開始訓(xùn)練,以防止訓(xùn)練過程沒有保存。 tf.keras.callbacks.ModelCheckpoint 允許在訓(xùn)練的過程中和結(jié)束時回調(diào)保存的模型。
tf.keras.callbacks.ModelCheckpoint對象是回調(diào)對象,該回調(diào)對象可以在每一個周期保存模型
實例化方法:
tf.keras.callbacks.ModelCheckpoint(
filepath, monitor=‘val_loss’, verbose=0, save_best_only=False,
save_weights_only=False, mode=‘a(chǎn)uto’, save_freq=‘epoch’, **kwargs
)
Arguments:
filepath:字符串類型,儲存模型的路徑
monitor: 監(jiān)視指標val_acc或者val_loss
verbose: 日志模型, 0 或者 1.
save_best_only: 布爾型,如果為true,根據(jù)監(jiān)視指標,最后一個最好的模型將不會被覆蓋,如果filepath 沒有包含格式化選項{epoch} ,保存的模型文件將會被新周期里更好的模型覆蓋。
mode: 可選填{‘a(chǎn)uto’, ‘min’, ‘max’}中的一個,如果save_best_only被設(shè)置為true,那么覆蓋操作的執(zhí)行,將根據(jù)監(jiān)視指標和這個參數(shù)來決定,比如max val_acc 和min val_loss ,如果被天填auto則會跟俊監(jiān)視指標指定選擇max 還是min
save_weights_only: 如果參數(shù)為真,則只保存模型的權(quán)值,而非整個模型,這個參數(shù)只要影響該回調(diào)對象是調(diào)用(model.save_weights(filepath)方法還是調(diào)用model.save(filepath).
save_freq: 填寫epoch或者一個數(shù)字,如果是epoch時,回調(diào)會在每個epoch之后保存模型。當使用integer時,回調(diào)將在處理n個樣本后保存模型,默認是’epoch’
例如:
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)
history = model.fit(x_train, y_train,
batch_size=64,
epochs=10, callbacks=[cp_callback])
Train on 60000 samples
Epoch 1/10
58304/60000 [>.] - ETA: 0s - loss: 0.3180
Epoch 00001: saving model to training_1/cp.ckpt
60000/60000 [] - 9s 150us/sample - loss: 0.3145
Epoch 2/10
58432/60000 [>.] - ETA: 0s - loss: 0.1484
Epoch 00002: saving model to training_1/cp.ckpt
60000/60000 [] - 2s 32us/sample - loss: 0.1476
Epoch 3/10
58624/60000 [>.] - ETA: 0s - loss: 0.1077
Epoch 00003: saving model to training_1/cp.ckpt
60000/60000 [] - 2s 31us/sample - loss: 0.1077
Epoch 4/10
58688/60000 [>.] - ETA: 0s - loss: 0.0861
Epoch 00004: saving model to training_1/cp.ckpt
60000/60000 [] - 2s 32us/sample - loss: 0.0860
Epoch 5/10
58624/60000 [>.] - ETA: 0s - loss: 0.0745
Epoch 00005: saving model to training_1/cp.ckpt
60000/60000 [] - 2s 31us/sample - loss: 0.0742
Epoch 6/10
58624/60000 [>.] - ETA: 0s - loss: 0.0630
Epoch 00006: saving model to training_1/cp.ckpt
60000/60000 [] - 2s 31us/sample - loss: 0.0627
Epoch 7/10
58944/60000 [>.] - ETA: 0s - loss: 0.0559
Epoch 00007: saving model to training_1/cp.ckpt
60000/60000 [] - 2s 33us/sample - loss: 0.0563
Epoch 8/10
59648/60000 [>.] - ETA: 0s - loss: 0.0493
Epoch 00008: saving model to training_1/cp.ckpt
60000/60000 [] - 2s 34us/sample - loss: 0.0493
Epoch 9/10
58816/60000 [>.] - ETA: 0s - loss: 0.0431
Epoch 00009: saving model to training_1/cp.ckpt
60000/60000 [] - 2s 34us/sample - loss: 0.0429
Epoch 10/10
58688/60000 [>.] - ETA: 0s - loss: 0.0398
Epoch 00010: saving model to training_1/cp.ckpt
60000/60000 [====================] - 2s 34us/sample - loss: 0.0397
tf.train.Checkpoint 保存與加載
使用tf.train.Checkpoint , 需要首先聲明一個 Checkpoint對象:
checkpoint = tf.train.Checkpoint(model=model)
這里 tf.train.Checkpoint() 接受的初始化參數(shù)比較特殊,是一個 **kwargs 。具體而言,是一系列的鍵值對,鍵名可以隨意取,值為需要保存的對象。例如,如果我們希望保存一個繼承 tf.keras.Model 的模型實例 model 和一個繼承 tf.train.Optimizer 的優(yōu)化器 optimizer ,我們可以這樣寫:
checkpoint = tf.train.Checkpoint(myAwesomeModel=model, myAwesomeOptimizer=optimizer)
接下來,當模型訓(xùn)練完成需要保存的時候,使用:
checkpoint.save(save_path_with_prefix)
就可以。 save_path_with_prefix 是保存文件的目錄 + 前綴。
當在其他地方需要為模型重新載入之前保存的參數(shù)時,需要再次實例化一個 checkpoint,同時保持鍵名的一致。再調(diào)用 checkpoint 的 restore 方法。就像下面這樣:
model = MyModel() # 待恢復(fù)參數(shù)的同一模型
checkpoint = tf.train.Checkpoint(myAwesomeModel=model) # 鍵名保持為“myAwesomeModel”
checkpoint.restore(save_path_with_prefix_and_index)
即可恢復(fù)模型變量。 save_path_with_prefix_and_index 是之前保存的文件的目錄 + 前綴 + 編號。例如,調(diào)用 checkpoint.restore(’./save/model.ckpt-1’) 就可以載入前綴為 model.ckpt ,序號為 1 的文件來恢復(fù)模型。
當保存了多個文件時,我們往往想載入最近的一個。可以使用 tf.train.latest_checkpoint(save_path) 這個輔助函數(shù)返回目錄下最近一次 checkpoint 的文件名。例如如果 save 目錄下有 model.ckpt-1.index 到 model.ckpt-10.index 的 10 個保存文件, tf.train.latest_checkpoint(’./save’) 即返回 ./save/model.ckpt-10 。
tf.train.CheckpointManager 管理檢查點
在定義 Checkpoint 后接著定義一個 CheckpointManager:
checkpoint = tf.train.Checkpoint(model=model)
manager = tf.train.CheckpointManager(checkpoint, directory=’./save’, checkpoint_name=‘model.ckpt’, max_to_keep=k)
此處, directory 參數(shù)為文件保存的路徑, checkpoint_name 為文件名前綴(不提供則默認為 ckpt ), max_to_keep 為保留的 Checkpoint 數(shù)目。
在需要保存模型的時候,我們直接使用 manager.save() 即可。如果我們希望自行指定保存的 Checkpoint 的編號,則可以在保存時加入 checkpoint_number 參數(shù)。例如 manager.save(checkpoint_number=100) 。
本文摘錄、翻譯自
Keras中文文檔
https://keras.io/zh/
TensorFlow官方
https://tensorflow.google.cn/
最全Tensorflow2.0 入門教程持續(xù)更新
https://zhuanlan.zhihu.com/p/59507137
簡單粗暴TensorFlow2
https://tf.wiki/zh/preface.html
總結(jié)
以上是生活随笔為你收集整理的tensorflow 1.x Saver(保存与加载模型) 预测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 垃圾回收 内存管理 python
- 下一篇: 模型部署web发布