2017-01-14 67 views
0

在Tensorflow,佔位符必須只如果目標依賴於它喂:現在如何調試節點評估的原因?

x = tf.placeholder(tf.int32, [], "x") 
y = 2 * x1 
y = tf.Print(y, ["Computed y"]) 
z = 2 * y 

# Error: should feed "x" 
z.eval() 

# OK, because y is not actually computed 
z.eval({y: 1}) 

,在我更復雜的圖形,我有我得到一些佔位符不喂一個錯誤的問題,但我認爲他們不應該被需要,通過上述相同的機制。

我該如何調試?該錯誤消息僅指出需要哪個佔位符,但不是爲什麼。從佔位符到目標的路徑是有幫助的。

我怎樣才能得到這些信息?

回答

2

如果圖不是巨大的,你可能只是做反向圖搜索的目標節點

def find(start, target): 
    """Returns path to parent from given start node""" 
    if start == target: 
     return [target] 
    for parent in start.op.inputs: 
     found_path = find(parent, target) 
     if found_path: 
      return [start]+found_path 
    return [] 

要使用它

tf.reset_default_graph() 
a1 = tf.ones(()) 
b1 = tf.ones(()) 
a2 = 2*a1 
b2 = 2*b1 
a3 = 2*a2 
b3 = 2*b2 
d4 = b3+a3 
find(d4, a1) 

應該返回

[<tf.Tensor 'add:0' shape=() dtype=float32>, 
<tf.Tensor 'mul_2:0' shape=() dtype=float32>, 
<tf.Tensor 'mul:0' shape=() dtype=float32>, 
<tf.Tensor 'ones:0' shape=() dtype=float32>] 

如果th Ë圖是大時,可以通過限制他們

之間

import tensorflow.contrib.graph_editor as ge 
ops_between = ge.get_walks_intersection_ops(source, target) 
ge.get_walks_intersection_ops doc

+0

尼斯,感謝搜索OPS加快步伐!如果TF將這些信息放在錯誤信息中,那將會很好。或者可能提供一個'AssertNotEvaluated'標識Op,如果違反,則輸出該路徑。 – Georg