[英]Tensorflow: When are variable assignments done in sess.run with a list?
我認為變量賦值是在給sess.run的列表中的所有操作之后完成的,但是下面的代碼在不同的執行時返回不同的結果。 它似乎在列表中隨機運行操作,並在列表中運行操作后分配變量。
a = tf.Variable(0)
b = tf.Variable(1)
c = tf.Variable(1)
update_a = tf.assign(a, b + c)
update_b = tf.assign(b, c + a)
update_c = tf.assign(c, a + b)
with tf.Session() as sess:
sess.run(initialize_all_variables)
for i in range(5):
a_, b_, c_ = sess.run([update_a, update_b, update_c])
我想知道變量賦值的時間。 哪個是正確的:“update_x - > assign x - > ... - > udpate_z - > assign z”或“update_x - > udpate_y - > udpate_z - > assign a,b,c”? (其中(x,y,z)是(a,b,c)的排列)此外,如果有一種方法可以實現后一種分配(在完成列表中的所有操作后完成分配),請讓我知道如何實現它。
三個操作update_a
, update_b
和update_c
在數據流圖中沒有相互依賴關系,因此TensorFlow可以選擇以任何順序執行它們。 (在當前的實現中,有可能所有三個都將在不同的線程上並行執行。)第二個缺點是默認情況下緩存了變量的讀取,因此在程序中update_b
中update_b
(即c + a
)可以使用原來的或更新后的值a
,這取決於當變量被首先讀出。
如果要確保以特定順序執行操作,可以使用with tf.control_dependencies([...]):
塊來強制執行在塊中創建的操作在列表中指定的操作之后發生。 您可以在with tf.control_dependencies([...]):
block中使用tf.Variable.read_value()
來顯示變量讀取的點。
因此,如果您想確保update_a
在update_b
之前update_b
並且update_b
發生在update_c
之前,您可以執行以下操作:
update_a = tf.assign(a, b + c)
with tf.control_dependencies([update_a]):
update_b = tf.assign(b, c + a.read_value())
with tf.control_dependencies([update_b]):
update_c = tf.assign(c, a.read_value() + b.read_value())
基於你的這個例子',
v = tf.Variable(0)
c = tf.constant(3)
add = tf.add(v, c)
update = tf.assign(v, add)
mul = tf.mul(add, update)
with tf.Session() as sess:
sess.run(tf.initialize_all_variables())
res = sess.run([mul, mul])
print(res)
輸出:[9,9]
你得到[9, 9]
,這實際上是我們要求它做的。 可以這樣想:
在運行期間,一旦從列表中取出mul
,它將查找此定義並找到tf.mul(add, update)
。 現在,它需要add
的值,這導致tf.add(v, c)
。 因此,它插入v
和c
的值,得到add
的值為3。
好的,現在我們需要update
的值,定義為tf.assign(v, add)
。 我們有兩個add
值(它現在計算為3)和v
。 因此,它將v
的值update
為3,這也是update
的值。
現在,它的add
和update
值都是3.因此,乘法在mul
產生9。
根據我們得到的結果,我認為,對於列表中的下一個項目(操作),它只返回剛剛計算出的mul
值。 我不確定它是再次執行這些步驟還是僅返回它剛剛為mul
計算的相同(緩存?)值,意識到我們已經得到結果或這些操作並行發生(對於列表中的每個元素)。 也許@mrry或@YaroslavBulatov可以對這部分發表評論嗎?
引用@ mrry的評論:
當你調用
sess.run([x, y, z])
一次,TensorFlow執行每個那些張量只依賴於一個時間 (除非有一個運算tf.while_loop()
在你的圖表)。 如果一個張量在列表中出現兩次(如示例中的mul
),TensorFlow將執行一次並返回結果的兩個副本 。 要多次運行賦值,必須多次調用sess.run()
,或使用tf.while_loop()
在圖中放置一個循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.