2017-09-06 5 views
1

Tensorflowのドキュメントを読んでいます。次のコードでは、最後の行を変更しました。私はTensorflow、印刷ロス機能により、feed_dictionaryなしでエラーが発生する

{x:X_train, y:y_train} 

を含める必要はありませんなぜprint(sess.run([W,B,loss], {x:X_train, y:y_train}))

:私は

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

は非常に最後の行を確認してください...正確に何が起こっている参照して、反復の最後の行をプッシュ声明を出すために?これを最後の行から除外すると、エラーが発生します。損失は​​すでに前にラインで計算されているので意味がありません。ありがとう

答えて

1

あなたのtrainでは、前の行がおそらく内部的に損失を計算していますが、何も出力していません。したがって、あなたのprintステートメントは、まずfeed_dictを渡す必要があるそれらの値を計算する必要があります。あなたが最後の2行を変更することで、この構文を回避できます。

_, 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 

上記の最初の行は、実際には、明示的にWB、およびloss OPSを実行し、W_valB_val、およびloss_valにその値を保存します。あなたは、保存された値であなたが望むものを何でもすることができます。

+1

ありがとうございました。私は今それを理解する。 –

2

lossを印刷すると、変数ではなくテンソルであることがわかります。これは、TensorFlowが計算グラフを定義し、sess.runを呼び出すときに実行するため、Pythonのような順次実行を実行しないためです。

lossをxとyの関数として考えると、sess.runは何をしているのですか?

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

ありがとうございます、それは正しいです –

関連する問題