是否允许在变量进入计算图之前为其赋值?

时间:2017-10-04 12:51:52

标签: python tensorflow

我定义了一个涉及变量的简单计算图。当我更改变量的值时,它对计算图的输出有预期的影响(因此,一切正常,如预期的那样):

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的不同值计算的。

如果我在定义c的计算方式之前为变量y分配值,问题就会开始。在这种情况下,我无法指定新值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旧值的结果。那是为什么?

2 个答案:

答案 0 :(得分:2)

使用TensorFlow,请始终牢记您正在构建computation graph。在您的第一个代码段中,您基本上定义了y = tf.placeholder(tf.float32) + tf.Variable([1.0, 1.0, 1.0], tf.float32)。在第二个示例中,您定义了y = tf.placeholder(tf.float32) + tf.assign(tf.Variable([1.0, 1.0, 1.0], tf.float32), [4.0, 4.0, 4.0])

因此,无论您为 c 指定哪个值,计算图都包含 assign 操作,并始终指定 [4.0,4.0,4.0] < / em>在计算总和之前使用它。

答案 1 :(得分:1)

我认为这是因为您在y = x + c之后定义了添加操作c = tf.assign(c, [4.0, 4.0, 4.0]),因此每次运行y时,c = tf.assign(c, [4.0, 4.0, 4.0])此操作将始终为虽然其他分配操作也将被执行,但不会影响最终结果。