如何在 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])

在上面的代码中,我定义了两个符号变量(y1y2),它们以相同的方式依赖于 xcx + 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 的不同值的原因对我来说很清楚:对 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]) 都是多余的,因为它会立即被新值覆盖 - 我不确定我是否正确理解了你的问题,所以请随时进一步详细说明你的问题.