2017-05-19 66 views
0

據我瞭解,我應該可以做這樣的事情的印刷者添加到我的圖:如何正確地將tf.Print()節點附加到我的張量流圖上?

a = nn_ops.softmax(s) 

a = tf.Print(a, [tf.shape(a)], message="This is shape a: ") 

並執行圖時本應打印的a形狀。然而,這個語句對我沒有輸出(我正在運行seq2seq tensorflow教程,這個softmax屬於注意函數,所以它肯定會被執行)。

得到輸出,如果不是我做這樣的事情:

ph = tf.placeholder(tf.float32, [3,4,5,6]) 

ts = tf.shape(ph) 

tp = tf.Print(ts, [ts], message="PRINT=") 

sess = tf.Session() 

sess.run(tp) 

然而,在我的真實的例子,sess.run()被稱爲seq2seq_model.py,如果我嘗試做sess.run(a)在關注功能,tensorflow抱怨:

You must feed a value for placeholder tensor 'encoder0' with dtype int32

,但我沒有在代碼中的這個點訪問輸入饋。我怎樣才能解決這個問題?

回答

0

如果您只想知道張量形狀,通常可以在不運行圖形的情況下推斷它。那麼你不需要tf.Print

例如,在第二代碼片段可以只使用:

ph = tf.placeholder(tf.float32, [3,4,5,6]) 
print(ph.get_shape()) 

如果想查看哪些上(使用tf.shape)輸入尺寸取決於形狀或你想看到的值還有取決於的輸入,不可能不提供輸入數據。

例如,如果您訓練模型,其中xy分別是您的樣本和標籤,則不提供它們就無法計算成本。

如果你有下面的代碼:

predictions = ... 
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(y_output, y_train)) 
cost = tf.Print(cost, [tf.shape(cost)], message='cost:') 

試圖無需提供佔位符值將無法正常工作,以評估它:

sess.run(cost) 
# error, no placeholder provided 

然而,這將如預期:

sess.run(cost, {x: x_train, y: y_train}) 

關於你的第一個代碼片段。爲了工作,需要執行tf.Print節點才能打印消息。我懷疑你的情況下,打印節點在進一步的計算過程中沒有被使用。

例如下面的代碼不會產生輸出:

import tensorflow as tf 

a = tf.Variable([1., 2., 3]) 
b = tf.Variable([1., 2., 3]) 

c = tf.add(a, b) 

# we create a print node, but it is never used 
a = tf.Print(a, [tf.shape(a)], message='a.shape: ') 

init = tf.global_variables_initializer() 

with tf.Session() as sess: 
    sess.run(init) 
    print(sess.run(c)) 

然而如果反向線使得打印節點計算過程中使用,你將看到的輸出:

a = tf.Print(a, [tf.shape(a)], message='a.shape: ') 
# now c depends on the tf.Print node 
c = tf.add(a, b) 
相關問題