若是不對模型參數進行保存,當訓練結束之後,模型也在內存中被釋放,下一輪又須要對模型進行從新訓練,有沒有一種方法,能夠利用以前已經訓練好的模型參數值,直接進行模型推理或者繼續訓練?這裏須要引入一個數據之久化的概念,其通用定義就是將內存中的數據模型轉換爲存儲模型,以及將存儲模型轉換爲內存中的數據模型的統稱。網絡
OK,在tensorflow中,持久化能夠是咱們訓練好的神經網絡權重值和biase值寫入到文件中,下一次直接從文件中進行讀取,而不須要從新對模型進行訓練。app
用tensorflow寫一個簡單的示例:求兩個變量v1和v2的和,而後將其保存result變量中,而後將其保存到文件中,下一次訓練時直接讀取文件。spa
先看保存程序:rest
import tensorflow as tf # 定義兩個變量,並對其進行求和 v1 = tf.Variable(tf.constant(value=1.0,dtype=tf.float32,shape=[1],name="v1")) v2 = tf.Variable(tf.constant(value=2.0,dtype=tf.float32,shape=[1],name="v2")) result = v1 + v2 # 將求和操做加到result集合中 tf.add_to_collection('result',result) # 新建一個持久化對象 saver = tf.train.Saver() # 運行會話,並持久化模型 init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) # 以下操做執行完之後,會在sample_test目錄下生成四個文件: # checkpoint:全部模型文件列表 # model.data-00000-of-00001: # model-index: # model.meta:計算圖的結構 saver.save(sess=sess,save_path="sample_test/model")
若是要從新加載模型,新的代碼能夠這麼寫:code
import tensorflow as tf # 從以前保存的點新建一個持久化對象 saver = tf.train.import_meta_graph(meta_graph_or_file="sample_test/model.meta") with tf.Session() as sess: # 從新加載保存的參數值 saver.restore(sess=sess,save_path="sample_test/model") # 注意get_collection返回一個列表,若是直接運行,結果也是一個List,注意比較下面的區別: print(tf.get_collection(key="result")) print(sess.run(tf.get_collection(key='result'))) ''' [<tf.Tensor 'add:0' shape=(1,) dtype=float32>] [array([3.], dtype=float32)] ''' print(tf.get_collection(key="result")[0]) print(sess.run(tf.get_collection(key='result')[0])) ''' tf.Tensor 'add:0' shape=(1,) [3.] '''
進一步,若是咱們的網絡結構加入了滑動平均模型,從新加載模型時,咱們每每是但願用其進行驗證,須要使用滑動平均模型參數的值,一個完整的示例以下:對象
訓練時:blog
# 導入庫 import tensorflow as tf # 定義一個變量 v = tf.Variable(initial_value=0,dtype=tf.float32,name='v') # 顯示當前有哪些變量 # <tf.Variable 'v:0' shape=() dtype=float32_ref> for variable in tf.global_variables(): print(variable) # 定義一個滑動平均模型,和變量應用模型的操做 ema = tf.train.ExponentialMovingAverage(0.999) maintain_average_op = ema.apply(tf.global_variables()) # 顯示當前有哪些變量 # <tf.Variable 'v:0' shape=() dtype=float32_ref> # <tf.Variable 'v/ExponentialMovingAverage:0' shape=() dtype=float32_ref> for variable in tf.global_variables(): print(variable) saver = tf.train.Saver() # 執行會話,並持久化 init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) sess.run(tf.assign(ref=v,value=10)) sess.run(maintain_average_op) saver.save(sess=sess,save_path="sample_test/model") print(sess.run([v,ema.average(v)]))
從新加載時:內存
import tensorflow as tf v = tf.Variable(0,dtype=tf.float32,name='v') ema = tf.train.ExponentialMovingAverage(0.999) saver = tf.train.Saver(ema.variables_to_restore()) # {'v/ExponentialMovingAverage': <tf.Variable 'v:0' shape=() dtype=float32_ref>} print(ema.variables_to_restore()) with tf.Session() as sess: saver.restore(sess,save_path="sample_test/model") # 自動加載滑動平均值來代替變量的值 # 0.009999871 print(sess.run(v))