我有以下简单的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])
)的第一次分配是在{定义{之前完成的{1}}因此,此分配成为y2
的计算图的一部分。
所以,现在我的问题是TensorFlow中是否有可能将值设置为y2
而不将赋值作为我稍后定义的所有符号变量的计算图的一部分。
换句话说,我想构建一个计算图(在上面的例子中是Variable
),它将获取变量y2
的当前值,并忽略所有已经分配的值在定义c
之前已经c
。
答案 0 :(得分:1)
您不应该使用assign操作覆盖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])
都是多余的,因为它会被新值立即覆盖 - 我不确定我是否理解您的问题,所以请随时进一步阐述您的问题