2016-11-25 195 views
0

我正在嘗試恢復張量流中保存的變量。似乎它非常非常複雜。如何恢復tensorflow中保存的變量?

我使用http://www.cs.toronto.edu/~guerzhoy/tf_alexnet/

的alexnet實施Python文件,alexnet.py,我定義變量

conv5W = tf.Variable(net_data["conv5"][0],name='conv5w') 

然後,我微調模型,我看到一些它的值都改變。我的打字保存微調,型號:

saver = tf.train.Saver() 
saver.save(sess,"modelname.ckpt") 

在那之後,我打開一個新的IPython的控制檯,然後運行:

from alexnet import * 
sess=tf.InteractiveSession() 
new_saver = tf.train.import_meta_graph("modelname.ckpt.meta") 
new_saver.restore(sess, "modelname.ckpt") 

,當我嘗試與檢索變量的值:

conv5W.eval(session=sess) 

它產生:

FailedPreconditionError: Attempting to use uninitialized value conv5w 
    [[Node: conv5w/_98 = _Send[T=DT_FLOAT, client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_4_conv5w", _device="/job:localhost/replica:0/task:0/gpu:0"](conv5w)]] 
    [[Node: conv5w/_99 = _Recv[_start_time=0, client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_4_conv5w", tensor_type=DT_FLOAT, _device="/job:localhost/replica:0/task:0/cpu:0"]()]] 

在另一方面,如果我初始化變量與:

init = tf.initialize_all_variables() 
sess.run([init]) , 

此時它產生在net_data["conv5"][0]的初始值,而不是微調,那些

回答

0

從元圖形恢復準備圖表,而不是數據。恢復數據需要在培訓時添加要恢復到集合對象的值,並在還原時重新加載這些集合。 official tutorial顯示了(實際上,還有另一種方式,見下文)。

另一種方法是恢復圖形(tf.write_graphtf.import_graph_def),然後從檢查點恢復所有變量。官方教程似乎更多地採用這種檢查點方法(請參閱上面的鏈接)。元圖的目標是分佈式處理,這需要更多的工作和關心。

0

Eric已經回答了您的大部分觀點。 我遇到了類似的問題,一個簡單的解決方法是:

  1. 重新加載或者是整個圖形或導入其元圖(前者是 建議,如果你是一個新手)。您還沒有運行恢復 功能
  2. 啓動會話,並初始化所有變量
  3. 還原(使用tf.train.Saver)檢查點

上,你的問題是,當你恢復後運行tf.initialize_all_variables(),張量流將它們重置爲初始值,並且你鬆開你的微調權重。