2017-03-04 62 views
1

我試圖從檢查點恢復圖形。檢查點由tf.Supervisor創建。有meta文件和檢查點。TensorFlow:eval恢復圖

我試圖實現的是從單獨的應用程序加載此圖以運行某些操作(即resue現有模型)。

我做到這一點,如下(這裏解釋:https://www.tensorflow.org/api_docs/python/tf/train/import_meta_graph):

meta = 'path/to/file.meta' 

my_graph = tf.Graph() 
with my_graph.as_default(): 
     with tf.Session() as sess: 
       saver = tf.train.import_meta_graph(meta) 
       saver.restore(sess, tf.train.latest_checkpoint(os.path.dirname(meta))) 
       op = my_graph.get_operation_by_name("op") 
       print(sess.run(op)) 

我看到的是None。我期望看到的是一維張量。 我使用get_collection檢查了my_graph對象,並發現op需要使用從檢查點恢復的值正確初始化所有我的變量。 我怎樣才能弄清楚爲什麼操作未被正確評估?我真的被困在這裏。

以下代碼:

print(sess.run(my_graph.get_operation_by_name("Variable_2"))) 
print(sess.run(my_graph.get_tensor_by_name("Variable_2:0"))) 

打印

None 
4818800 

彷彿存在操作和對應的變量之間沒有連接。

回答

4

tf.Graph.get_operation_by_name()方法總是返回一個tf.Operation對象。當您將tf.Operation對象傳遞給tf.Session.run()時,TensorFlow將執行該操作(以及它所依賴的所有內容)並放棄其輸出(如果有)。

如果你有興趣在一個特定輸出的值,你必須告訴TensorFlow其輸出(tf.Tensor)你有興趣主要有兩種選擇:

  • 獲取從一個tf.Operation圖,然後選擇一個其outputs

    op = my_graph.get_operation_by_name("op") 
    output = op.outputs[0] 
    print(sess.run(output)) 
    
  • 通過調用tf.Graph.get_tensor_by_name(),並追加獲取從圖表中tf.Tensor 0到操作的名稱:

    output = my_graph.get_tensor_by_name("op:0") 
    print(sess.run(output)) 
    

爲什麼TensorFlow得出這樣的區別?首先,一個操作可以有多個輸出,所以有時需要詳細說明你想要獲取哪個輸出。另一種情況是,操作可能會產生副作用併產生較大的輸出 - 例如參見tf.assign() - 通過tf.Operationsess.run()以便該值不會被複制回Python程序通常更高效。