2017-09-06 2 views
1

Ich lese gerade Tensorflow-Dokumentation. Im folgenden Code habe ich gerade die letzte Zeile geändert. Ich schob letzte Zeile in Iteration, um zu sehen, was genau vor sich geht ...Tensorflow, Druckverlust-Funktion verursacht Fehler ohne feed_dictionary

import tensorflow as tf 

# linear_model = W*x+B 

W = tf.Variable(.3, dtype=tf.float32) 
B = tf.Variable(-3., dtype=tf.float32) 
x = tf.placeholder(dtype=tf.float32) #data_X 
linear_model = W*x+B 

y = tf.placeholder(dtype=tf.float32) #data_Y 

loss = tf.reduce_sum(tf.square(linear_model-y)) 

optimizer = tf.train.GradientDescentOptimizer(0.01) 
train = optimizer.minimize(loss) 

X_train = [1.0,2.0,3.0,4.0] #data_X 
y_train = [0.0,-1.0,-2.0,-3.0] #data_y 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in range(1000): 
     sess.run(train,{x:X_train, y:y_train}) 
     print(sess.run([W,B,loss], {x:X_train, y:y_train})) 

Bitte überprüfen Sie die allerletzte Zeile: print(sess.run([W,B,loss], {x:X_train, y:y_train}))

Warum ich einschließen tun müssen

{x:X_train, y:y_train} 

in Um Ausdruck zu drucken? Wenn Sie dies aus der letzten Zeile ausschließen, erhalten Sie einen Fehler. Es macht keinen Sinn, weil der Verlust bereits in der Zeile vorher berechnet wird. Danke

Antwort

1

Die Zeile zuvor berechnet wahrscheinlich Verlust intern in Ihrem train op, aber es gibt nichts aus. Ihre print-Anweisung muss daher zuerst die Werte berechnen, für die Sie die feed_dict übergeben müssen. Sie könnten um diese Syntax zu erhalten, indem man die letzten beiden Zeilen:

_, W_val, B_val, loss_val = sess.run([train, W, B, loss], {x: X_train, y:y_train}) # run ops all at once, storing desired results 
print(W_val, B_val, loss_val) # do whatever you want with stored results 

Die erste Zeile oben tatsächlich führt die W, B und loss ops explizit und speichert ihre Werte W_val, B_val und loss_val. Sie können dann mit diesen gespeicherten Werten machen, was Sie wollen.

+1

Vielen Dank. Ich verstehe es jetzt. –

2

Wenn Sie loss ausdrucken, werden Sie sehen, dass es ein Tensor ist, keine Variable. Dies liegt daran, dass TensorFlow ein Berechnungsdiagramm definiert und es dann ausführt, wenn Sie sess.run aufrufen. Es führt keine sequenzielle Ausführung wie Python aus.

Sie können sich loss als eine Funktion von x und y vorstellen, um zu sehen, was sess.run tut.

execute loss() # not enough information to calculate loss 
execute loss(x, y) # this will run loss 
+0

Danke, es ist korrekt –