如何在 TensorFlow 中将值分配给变量和计算图?
How separate assignment of a value to a Variable and computational graph in 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])
在上面的代码中,我定义了两个符号变量(y1
和 y2
),它们以相同的方式依赖于 x
和 c
(x + c
).共享变量c
在每个时间点都有一个值。每当我评估 y1
和 y2
时,我总是得到与 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.]
y1
和 y2
的不同值的原因对我来说很清楚:对 c
(c = tf.assign(c, [10.0, 20.0])
) 的第一次赋值是在定义之前完成的y2
的,因此该赋值成为 y2
.
的计算图的一部分
所以,现在我的问题是,在 TensorFlow 中是否可以将一个值设置为 Variable
,而无需将赋值作为我稍后定义的所有符号变量的计算图的一部分。
换句话说,我想构建一个计算图(在上面的例子中是 y2
的计算图),它将采用变量 c
的当前值并忽略所有赋值在 y2
被定义之前已经被设置为 c
。
您只是不应该用赋值操作覆盖 Python 变量 c。您可以通过 运行 相应的 assign 操作为 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.]
如果出于某种原因你想将赋值操作存储在一个变量中,只需给它另一个名字:
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.]
请注意,在这两种情况下,tf.assign(c, [10.0, 20.0])
都是多余的,因为它会立即被新值覆盖 - 我不确定我是否正确理解了你的问题,所以请随时进一步详细说明你的问题.
我有以下简单的 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])
在上面的代码中,我定义了两个符号变量(y1
和 y2
),它们以相同的方式依赖于 x
和 c
(x + c
).共享变量c
在每个时间点都有一个值。每当我评估 y1
和 y2
时,我总是得到与 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.]
y1
和 y2
的不同值的原因对我来说很清楚:对 c
(c = tf.assign(c, [10.0, 20.0])
) 的第一次赋值是在定义之前完成的y2
的,因此该赋值成为 y2
.
所以,现在我的问题是,在 TensorFlow 中是否可以将一个值设置为 Variable
,而无需将赋值作为我稍后定义的所有符号变量的计算图的一部分。
换句话说,我想构建一个计算图(在上面的例子中是 y2
的计算图),它将采用变量 c
的当前值并忽略所有赋值在 y2
被定义之前已经被设置为 c
。
您只是不应该用赋值操作覆盖 Python 变量 c。您可以通过 运行 相应的 assign 操作为 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.]
如果出于某种原因你想将赋值操作存储在一个变量中,只需给它另一个名字:
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.]
请注意,在这两种情况下,tf.assign(c, [10.0, 20.0])
都是多余的,因为它会立即被新值覆盖 - 我不确定我是否正确理解了你的问题,所以请随时进一步详细说明你的问题.