1. 程式人生 > >Tensorflow模型持久化的程式碼實現

Tensorflow模型持久化的程式碼實現

1.儲存模型

import tensorflow as tf

v1 = tf.Variable(tf.constant(1.0, shape=[1]),name="v1")
v2 = tf.Variable(tf.constant(2.0, shape=[1]),name="v2")
result = v1 + v2

init_op = tf.global_variables_initializer()
saver = tf.train.Saver()#宣告tf.train.Saver()類用於儲存模型

with tf.Session() as sess:
    sess.run(init_op)
    saver.save(sess, "test/test.ckpt"
)#將模型保存於test資料夾中

執行該程式後,將在test檔案中出現以下的檔案

這裡寫圖片描述

2.載入模型

import tensorflow as tf

v1 = tf.Variable(tf.constant(1.0, shape=[1]),name="v1")
v2 = tf.Variable(tf.constant(4.0, shape=[1]),name="v2")
result = v1 + v2

saver = tf.train.Saver()

with tf.Session() as sess:
    saver.restore(sess, "test/test.ckpt"
)#載入已經儲存的模型,並通過已經儲存的模型中的變數的值來計算加法 print(sess.run(result)) #計算輸出結果為[3.]不是[5.]是因為該程式載入了之前儲存的模型,所以計算的變數也是儲存的模型中的變數

這裡寫圖片描述

如果不希望重複定義變數以及運算,可以直接載入已經持久化的圖

    import tensorflow as tf

saver = tf.train.import_meta_graph("test/test.ckpt.meta")
with tf.Session() as sess:
    saver.restore(sess, "test/test.ckpt"
) #通過張量的名稱來獲取張量 print(sess.run(tf.get_default_graph().get_tensor_by_name("add:0"))) #輸出[3.]

該程式預設儲存和載入了Tensorflow計算圖中定義的全部變數。

3.載入或者儲存部分變數

saver = tf.train.Saver([v1])#該命令只用來載入變數v1

4.載入或者儲存時對變數重新命名

# 這裡宣告的變數名稱和已經儲存的模型中變數的名稱不同
V1=tf.Variable(tf.constant(1.0,shape=[1]),name="other-v1")
V2=tf.variable(tf.constant (2.0,shape=[1]),name="other-v2")

# 如果直接使用tf.train.Saver () 來載入模型會報變數找不到的錯誤。下面顯示了報錯資訊:
# tensorflow.python.framewotk.erors.NotFoundError: Tensor name "other-v2"
# not found in checkpoint files /test/test.ckpt

# 使用一個字典(aictionary) 來重新命名變數可以就可以載入原來的模型了。這個字典指定了
# 原來名稱為v1的變數現在載入到變數v1中(名稱為other-v1),名稱為v2的變數
# 載入到變數v2 中(名稱為other-v2)。
saver=tf.train.Saver({"v1"=v1,"v2":v2})

如果直接通過saver=tf.train.Saver預設構造的函式來載入儲存的模型,那麼程式會報變數找不到的錯誤。因為儲存時候的變數和載入時的變數的名稱不一致。因此可以通過字典來將儲存時和載入是的變數聯絡起來。