day-20 tensorflow持久化之入門學習

       若是不對模型參數進行保存,當訓練結束之後,模型也在內存中被釋放,下一輪又須要對模型進行從新訓練,有沒有一種方法,能夠利用以前已經訓練好的模型參數值,直接進行模型推理或者繼續訓練?這裏須要引入一個數據之久化的概念,其通用定義就是將內存中的數據模型轉換爲存儲模型,以及將存儲模型轉換爲內存中的數據模型的統稱。網絡

       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))
相關文章
相關標籤/搜索