2017-05-19 5 views
0

Soweit ich es verstehe, soll ich in der Lage sein, einen Druck Operator meine Grafik hinzufügen, indem Sie so etwas wie dies zu tun:Wie ordne ich einen tf.Print() -Knoten korrekt an meine Tensorflow-Grafik an?

a = nn_ops.softmax(s) 

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

und wenn der Graph ausgeführt wird dies sollte die Form a drucken. Diese Anweisung erzeugt jedoch keine Ausgabe für mich (ich leite das Lernprogramm seq2seq tensorflow und dieses Softmax gehört zur Aufmerksamkeitsfunktion, also wird es definitiv ausgeführt).

ich tun Ausgang, wenn stattdessen ich so etwas tun:

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) 

jedoch in meinem realen Beispiel wird sess.run() in seq2seq_model.py genannt, und wenn ich versuche, sess.run(a) in der Aufmerksamkeit zu tun Funktion, tensorflow klagt:

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

aber ich habe keinen Zugriff auf den Eingangs-Feed an dieser Stelle im Code. Wie kann ich das beheben?

Antwort

0

Falls Sie wollen einfach nur die Tensor Form wissen, oft kann es, ohne das Diagramm zu entnehmen. Dann brauchen Sie nicht tf.Print.

Zum Beispiel in dem zweiten Codefragment können Sie einfach verwenden:

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

Wenn Sie die Form sehen möchten, die auf der Eingangsgröße abhängt (mit tf.shape) oder Sie einen Wert sehen, welche auch hängt auf den Eingang, ist es nicht möglich, ohne die Eingabe von Daten zu tun.

Zum Beispiel, wenn Sie das Modell trainieren, wo x und y Ihre Proben bzw. Etiketten sind, können Sie Kosten nicht berechnen, ohne sie zu liefern.

Wenn Sie den folgenden Code:

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:') 

Der Versuch, es zu bewerten, ohne Platzhalter Werte Bereitstellung wird nicht funktionieren:

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

Dies wird jedoch wie erwartet:

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

In Bezug auf Ihr erstes Codefragment. Um zu arbeiten, muss tf.Print Knoten ausgeführt werden, um eine Nachricht zu drucken. Ich vermute, in Ihrem Fall wird der Druckknoten bei weiteren Berechnungen nicht verwendet.

Zum Beispiel der folgende Code wird nicht produzieren Ausgabe:

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)) 

Allerdings, wenn Sie Linien umgekehrt, so dass der Druckknoten während Berechnungen verwendet wird, werden Sie die Ausgabe sehen:

a = tf.Print(a, [tf.shape(a)], message='a.shape: ') 
# now c depends on the tf.Print node 
c = tf.add(a, b) 
Verwandte Themen