2017-10-06 82 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])是多餘的,因爲這將是由新的價值立即被覆蓋 - 我不知道如果我理解正確你的問題,所以請隨時進一步闡述您的問題。

相關問題