2017-10-06 3 views
0

I私はTensorFlowで再現したい次の簡単なTheanoコードがあります。上記のコードでTensorFlowで変数と計算グラフにどのように値を割り当てるか?

import theano as th 
import theano.tensor as T 
import numpy as np 

x = T.vector() 
c = th.shared(np.array([1.0, 2.0])) 
y1 = x + c 
c.set_value(np.array([10.0, 20.0])) 
y2 = x + c 
c.set_value(np.array([100.0, 200.0])) 
print 'Y1:', th.function([x],y1)([0.0, 0.0]) 
print 'Y2:', th.function([x],y2)([0.0, 0.0]) 

私はxと同じようにc依存する2つのシンボリック変数(y1y2)を定義する(x + c )。各時点での共有変数cには値があります。 y1y2を評価するたびに、常に現在の値cに対応する同一の値が得られます。

は今、これは私がTensorFlowでそれを再現しようとする方法である:

import tensorflow as tf 

s = tf.Session() 
x = tf.placeholder(tf.float32) 
c = tf.Variable([1.0, 2.0]) 
y1 = x + c 
c = tf.assign(c, [10.0, 20.0]) 
s.run(c) 
y2 = x + c 
c = tf.assign(c, [100.0, 200.0]) 
s.run(c) 
print 'Y1:', s.run(y1, feed_dict = {x : [0.0, 0.0]}) 
print 'Y2:', s.run(y2, feed_dict = {x : [0.0, 0.0]}) 

第一の観点から、コードの構造が(ちょうど別の構文)と同じです。しかし、その動作は異なります。このコードの出力として、私は得る:

Y1: [ 100. 200.] 
Y2: [ 10. 20.] 

y1y2の異なる値の理由は、私には明確である:cc = tf.assign(c, [10.0, 20.0]))への最初の割り当てがため、このy2との定義の前に行われています代入はy2の計算グラフの一部になります。

私の質問は、後で定義するすべてのシンボリック変数の計算グラフの一部を割り当てなくても、TensorFlowで値をVariableに設定できるかどうかです。言い換えれば

は、私は、変数cの現在の値を取るとされているy2cに対して行われたすべての割り当てを無視します(上記の場合y2のための1)の計算、グラフを構築したいです定義された。

答えて

1

assign操作でPython変数cを上書きしないでください。

s = tf.Session() 
x = tf.placeholder(tf.float32) 
c = tf.Variable([1.0, 2.0]) 
y1 = x + c 
s.run(tf.assign(c, [10.0, 20.0])) 
y2 = x + c 
s.run(tf.assign(c, [100.0, 200.0])) 

print 'Y1:', s.run(y1, feed_dict = {x : [0.0, 0.0]}) # Y1: [ 100. 200.] 
print 'Y2:', s.run(y2, feed_dict = {x : [0.0, 0.0]}) # Y2: [ 100. 200.] 

場合は、変数に代入操作を格納したい何らかの理由で、ちょうどそれに別の名前を付けるために:あなたは、対応するはこのよう操作を割り当てて実行することにより、Cに新しい値を割り当てることができます。私は私が正しくあなたの質問を理解している場合はわからないので、さらにあなたの問題を詳しく説明すること自由に感じなさい - それはすぐに新しい値で上書きされるように、両方のケースでは、tf.assign(c, [10.0, 20.0])が冗長であることを

s = tf.Session() 
x = tf.placeholder(tf.float32) 
c = tf.Variable([1.0, 2.0]) 
y1 = x + c 
a = tf.assign(c, [10.0, 20.0]) 
s.run(a) 
y2 = x + c 
a = tf.assign(c, [100.0, 200.0]) 
s.run(a) 
print 'Y1:', s.run(y1, feed_dict = {x : [0.0, 0.0]}) # Y1: [ 100. 200.] 
print 'Y2:', s.run(y2, feed_dict = {x : [0.0, 0.0]}) # Y2: [ 100. 200.] 

注意。

関連する問題