標籤:

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 |