如何在TensorFlow中将值分配给变量和计算图?

时间:2017-10-06 08:46:04

标签: python tensorflow theano

我有以下简单的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)定义了依赖于y2x的两个符号变量(cx + 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]))的第一次分配是在{定义{之前完成的{1}}因此,此分配成为y2的计算图的一部分。

所以,现在我的问题是TensorFlow中是否有可能将值设置为y2而不将赋值作为我稍后定义的所有符号变量的计算图的一部分。

换句话说,我想构建一个计算图(在上面的例子中是Variable),它将获取变量y2的当前值,并忽略所有已经分配的值在定义c之前已经c

1 个答案:

答案 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])都是多余的,因为它会被新值立即覆盖 - 我不确定我是否理解您的问题,所以请随时进一步阐述您的问题