Tensorflow學習(一):模型保存與恢復
最近在學習Tensorflow,想將所學通過知乎文章的形式進行總結,以饗讀者。
首先明確一點,tensorflow保存的是什麼?
模型保存後產生四個文件,分別是:
|--models| |--checkpoint| |--.meta| |--.data| |--.index
其中.meta保存的是圖的結構,checkpoint文件是個文本文件,裡面記錄了保存的最新的checkpoint文件以及其它checkpoint文件列表,.data和.index保存的是變數值。
即模型保存的是圖的結構和變數值。
一 實例
以下是使用tensorflow實現簡單的線性模型:
#生成樣本數據x = np.random.randn(10000,1)y = 0.03*x+0.8#定義模型參數Weights = tf.Variable(tf.random_normal([1],seed=1,stddev=1),name=Weights)bias = tf.Variable(tf.random_normal([1],seed=1,stddev=1),name=bias)xx = tf.placeholder(tf.float32,shape=(None,1),name=xx)yy = tf.placeholder(tf.float32,shape=(None,1),name=yy)#線性模型y_predict = tf.add(Weights*xx,bias,name=preds)#損失函數loss = tf.reduce_mean(tf.square(yy-y_predict))#優化方法optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)#批訓練模型batchsize = 20samplesize = 100start = 0end = 0with tf.Session() as sess: init_var = tf.global_variables_initializer() sess.run(init_var) print(before training, variable is %s,%s%(sess.run(Weights),sess.run(bias))) for i in (range(5000)):# start = (i*batchsize)%100 if end == samplesize: start = 0 end = np.minimum(start+batchsize,samplesize)# try:# end = np.min(start+batchsize,samplesize)# except:# print(end) sess.run(optimizer,feed_dict={xx:x[start:end],yy:y[start:end]}) if (i+1)%1000 == 0: print(sess.run(loss,feed_dict={xx:x[start:end],yy:y[start:end]})) start += batchsize print(after training, variable is %s,%s%(sess.run(Weights),sess.run(bias)))
二 模型保存
通過以下程序可實現保存:
saver = tf.train.Saver()saver.save(session,dir[,global_step])
save中第一個參數是session,第二個參數是模型保存的位置,第三個參數申明模型每迭代多少步保存一次。
保存一中的模型,並設置每1000步保存一次:
#生成樣本數據x = np.random.randn(10000,1)y = 0.03*x+0.8#定義模型參數Weights = tf.Variable(tf.random_normal([1],seed=1,stddev=1),name=Weights)bias = tf.Variable(tf.random_normal([1],seed=1,stddev=1),name=bias)xx = tf.placeholder(tf.float32,shape=(None,1),name=xx)yy = tf.placeholder(tf.float32,shape=(None,1),name=yy)#線性模型y_predict = tf.add(Weights*xx,bias,name=preds)#損失函數loss = tf.reduce_mean(tf.square(yy-y_predict))#優化方法optimizer = tf.train.GradientDescentOptimizer(0.01).minimize(loss)#批訓練模型batchsize = 20samplesize = 100start = 0end = 0with tf.Session() as sess: init_var = tf.global_variables_initializer() sess.run(init_var) saver = tf.train.Saver() print(before training, variable is %s,%s%(sess.run(Weights),sess.run(bias))) for i in (range(5000)):# start = (i*batchsize)%100 if end == samplesize: start = 0 end = np.minimum(start+batchsize,samplesize)# try:# end = np.min(start+batchsize,samplesize)# except:# print(end) sess.run(optimizer,feed_dict={xx:x[start:end],yy:y[start:end]}) #實現每1000步保存一次模型 if (i+1)%1000 == 0: saver.save(sess,modelsckp,1000) print(sess.run(loss,feed_dict={xx:x[start:end],yy:y[start:end]})) start += batchsize print(after training, variable is %s,%s%(sess.run(Weights),sess.run(bias)))
以下代碼實現了每1000步保存一次模型
if (i+1)%1000 == 0: saver.save(sess,modelsckp,1000)
之所以這樣做,是為了防止意外情況下(比如訓練時突然斷電)下次訓練需要從頭開始訓練。
保存的目錄結構如下
|--models| |--checkpoint| |--ckp-1000.meta| |--ckp-1000.data-00000-of-00001| |--ckp-1000.index
三 模型恢復
首先載入保存的meta文件
saver = tf.train.import_meta_graph(file_name)
恢復參數,依賴於session,dir表示模型保存的目錄路徑,此時所有張量的值都在session中
saver.restore(session,tf.train.latest_checkpoint(dir))
獲取恢復的參數,varname表示恢復的參數名,因此建議所有的參數都加上name屬性
graph = tf.get_default_graph()graph.get_tensor_by_name(varname)
實際上,graph需取session打開的graph,因為所有的變數和結構都在session的打開的graph中,而一般session使用的是默認的graph。
以下給出回歸模型的恢復,並利用訓練好的模型進行預測:
with tf.Session() as sess: saver = tf.train.import_meta_graph(modelsckp-1000.meta) saver.restore(sess,tf.train.latest_checkpoint(models)) graph = tf.get_default_graph() #恢復傳入值 xx = graph.get_tensor_by_name(xx:0) #計算利用訓練好的模型參數計算預測值 preds = graph.get_tensor_by_name(preds:0) print(predict values:%s % sess.run(preds,feed_dict={xx:x}))
推薦閱讀:
※TensorFlow 101
※深入淺出Tensorflow(一):深度學習及TensorFlow簡介
※Tensorflow on Spark爬坑指南
※乾貨 | TensorFlow的55個經典案例
※劉光聰 | TensorFlow:揭示多語言編程的奧秘
TAG:Python | TensorFlow |