2017-10-06 106 views
0

我有我想在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]) 

在上面的代码我定义依赖于x和以相同的方式c 2个符号变量(y1y2)(x + 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]))是y2,因此这个定义之前完成分配成为y2的计算图的一部分。

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

换句话说,我想建立的计算曲线图(在上述情况下,一个用于y2),将带可变c的当前值,而忽略所有已作出cy2之前已经分配定义。

回答

1

你只是不应该用赋值操作覆盖Python变量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])是多余的,因为这将是由新的价值立即被覆盖 - 我不知道如果我理解正确你的问题,所以请随时进一步阐述您的问题。

相关问题