2017-10-04 8 views
0

私は、変数を含む単純な計算グラフを定義します。私は、変数の値を変更すると、それは、計算、グラフの出力に予想される影響力を持っている(予想ほど、すべてが、正常に動作します):計算グラフに入る前に変数に値を代入することは許されていますか?

s = tf.Session() 

x = tf.placeholder(tf.float32) 
c = tf.Variable([1.0, 1.0, 1.0], tf.float32) 

y = x + c 

c = tf.assign(c, [3.0, 3.0, 3.0]) 
s.run(c) 
print 'Y1:', s.run(y, {x : [10.0, 20.0, 30.0]}) 

c = tf.assign(c, [2.0, 2.0, 2.0]) 
s.run(c) 
print 'Y2:', s.run(y, {x : [10.0, 20.0, 30.0]}) 

私はこのコードを呼び出すときに私が取得:

Y1: [ 13. 23. 33.] 
Y2: [ 12. 22. 32.] 

Y1Y2の後の値は、異なる値のcで計算されるため、期待どおりに異なります。

yの計算にどのように関与するかを定義する前に、変数cに値を割り当てると問題が発生します。この場合、私はcの新しい値を割り当てることができません。私が手出力として

s = tf.Session() 

x = tf.placeholder(tf.float32) 
c = tf.Variable([1.0, 1.0, 1.0], tf.float32) 

c = tf.assign(c, [4.0, 4.0, 4.0]) # this is the line that causes problems 
y = x + c 

c = tf.assign(c, [3.0, 3.0, 3.0]) 
s.run(c) 
print 'Y1:', s.run(y, {x : [10.0, 20.0, 30.0]}) 

c = tf.assign(c, [2.0, 2.0, 2.0]) 
s.run(c) 
print 'Y2:', s.run(y, {x : [10.0, 20.0, 30.0]}) 

Y1: [ 14. 24. 34.] 
Y2: [ 14. 24. 34.] 

あなたが見ることができるように、私はyを計算するたびに、私はcの古い値を含む結果を得ることができます。何故ですか?

答えて

1

TensorFlowでは、computation graphを構築していることに常に注意してください。最初のコードスニペットでは、基本的にy = tf.placeholder(tf.float32) + tf.Variable([1.0, 1.0, 1.0], tf.float32)を定義します。 2番目の例では、y = tf.placeholder(tf.float32) + tf.assign(tf.Variable([1.0, 1.0, 1.0], tf.float32), [4.0, 4.0, 4.0])を定義します。

ので、関係なく、あなたがCに割り当てる値れ、計算グラフは操作を割り当て、常に合計を計算する前に、それに[4.0、4.0、4.0]を割り当てます含まれていません。

1

私はそれはあなたが右c = tf.assign(c, [4.0, 4.0, 4.0])後の追加操作y = x + cを定義するので、あなたが出てyを実行するたびに、c = tf.assign(c, [4.0, 4.0, 4.0])このopは常にexcutedされ、他のアサイン操作もexcutedされますが、しかし、影響はありませんので、これがあると思います最終的な結果。

関連する問題