tensorflow模型繼續訓練 fineturn例項
阿新 • • 發佈:2020-01-22
解決tensoflow如何在已訓練模型上繼續訓練fineturn的問題。
訓練程式碼
任務描述: x = 3.0,y = 100.0, 運算公式 x×W+b = y,求 W和b的最優解。
# -*- coding: utf-8 -*-) import tensorflow as tf # 宣告佔位變數x、y x = tf.placeholder("float",shape=[None,1]) y = tf.placeholder("float",[None,1]) # 宣告變數 W = tf.Variable(tf.zeros([1,1]),name='w') b = tf.Variable(tf.zeros([1]),name='b') # 操作 result = tf.matmul(x,W) + b # 損失函式 lost = tf.reduce_sum(tf.pow((result - y),2)) # 優化 train_step = tf.train.GradientDescentOptimizer(0.0007).minimize(lost) with tf.Session() as sess: # 初始化變數 sess.run(tf.global_variables_initializer()) saver = tf.train.Saver(max_to_keep=3) # 這裡x、y給固定的值 x_s = [[3.0]] y_s = [[100.0]] step = 0 while (True): step += 1 feed = {x: x_s,y: y_s} # 通過sess.run執行優化 sess.run(train_step,feed_dict=feed) if step % 1000 == 0: print 'step: {0},loss: {1}'.format(step,sess.run(lost,feed_dict=feed)) if sess.run(lost,feed_dict=feed) < 1e-10 or step > 4e3: print '' # print 'final loss is: {}'.format(sess.run(lost,feed_dict=feed)) print 'final result of {0} = {1}(目標值是100.0)'.format('x×W+b',3.0 * sess.run(W) + sess.run(b)) print '' print("模型儲存的W值 : %f" % sess.run(W)) print("模型儲存的b : %f" % sess.run(b)) break saver.save(sess,"./save_model/re-train",global_step=step) # 儲存模型
訓練完成之後生成模型檔案:
訓練輸出:
step: 1000,loss: 4.89526428282e-08 step: 2000,loss: 4.89526428282e-08 step: 3000,loss: 4.89526428282e-08 step: 4000,loss: 4.89526428282e-08 step: 5000,loss: 4.89526428282e-08 final result of x×W+b = [[99.99978]](目標值是100.0) 模型儲存的W值 : 29.999931 模型儲存的b : 9.999982
儲存在模型中的W值是 29.999931,b是 9.999982。
以下程式碼從儲存的模型中恢復出訓練狀態,繼續訓練
任務描述: x = 3.0,y = 200.0, 運算公式 x×W+b = y,從上次訓練的模型中恢復出訓練引數,繼續訓練,求 W和b的最優解。
# -*- coding: utf-8 -*-) import tensorflow as tf # 宣告佔位變數x、y x = tf.placeholder("float",1]) with tf.Session() as sess: # 初始化變數 sess.run(tf.global_variables_initializer()) # saver = tf.train.Saver(max_to_keep=3) saver = tf.train.import_meta_graph(r'./save_model/re-train-5000.meta') # 載入模型圖結構 saver.restore(sess,tf.train.latest_checkpoint(r'./save_model')) # 恢復資料 # 從儲存模型中恢復變數 graph = tf.get_default_graph() W = graph.get_tensor_by_name("w:0") b = graph.get_tensor_by_name("b:0") print("從儲存的模型中恢復出來的W值 : %f" % sess.run("w:0")) print("從儲存的模型中恢復出來的b值 : %f" % sess.run("b:0")) # 操作 result = tf.matmul(x,W) + b # 損失函式 lost = tf.reduce_sum(tf.pow((result - y),2)) # 優化 train_step = tf.train.GradientDescentOptimizer(0.0007).minimize(lost) # 這裡x、y給固定的值 x_s = [[3.0]] y_s = [[200.0]] step = 0 while (True): step += 1 feed = {x: x_s,feed_dict=feed) if step % 1000 == 0: print 'step: {0},feed_dict=feed)) print 'final result of {0} = {1}(目標值是200.0)'.format('x×W+b',3.0 * sess.run(W) + sess.run(b)) print("模型儲存的W值 : %f" % sess.run(W)) print("模型儲存的b : %f" % sess.run(b)) break saver.save(sess,"./save_mode/re-train",global_step=step) # 儲存模型
訓練輸出:
從儲存的模型中恢復出來的W值 : 29.999931 從儲存的模型中恢復出來的b值 : 9.999982 step: 1000,loss: 1.95810571313e-07 step: 2000,loss: 1.95810571313e-07 step: 3000,loss: 1.95810571313e-07 step: 4000,loss: 1.95810571313e-07 step: 5000,loss: 1.95810571313e-07 final result of x×W+b = [[199.99956]](目標值是200.0) 模型儲存的W值 : 59.999866 模型儲存的b : 19.999958
從儲存的模型中恢復出來的W值是 29.999931,b是 9.999982,跟模型儲存的值一致,說明載入成功。
總結
從頭開始訓練一個模型,需要通過 tf.train.Saver建立一個儲存器,完成之後使用save方法儲存模型到本地:
saver = tf.train.Saver(max_to_keep=3) …… saver.save(sess,global_step=step) # 儲存模型
在訓練好的模型上繼續訓練,fineturn一個模型,可以使用tf.train.import_meta_graph方法載入圖結構,使用restore方法恢復訓練資料,最後使用同樣的save方法儲存到本地:
saver = tf.train.import_meta_graph(r'./save_model/re-train-10050.meta') # 載入模型圖結構 saver.restore(sess,tf.train.latest_checkpoint(r'./save_model')) # 恢復資料 saver.save(sess,global_step=step) # 儲存模型
注:特殊情況下(如本例)需要從恢復的模型中加載出資料:
# 從儲存模型中恢復變數 graph = tf.get_default_graph() W = graph.get_tensor_by_name("w:0") b = graph.get_tensor_by_name("b:0")
以上這篇tensorflow模型繼續訓練 fineturn例項就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。