簡體   English   中英

Tensorflow:sess.run中帶有列表的變量賦值何時完成?

[英]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_aupdate_bupdate_c在數據流圖中沒有相互依賴關系,因此TensorFlow可以選擇以任何順序執行它們。 (在當前的實現中,有可能所有三個都將在不同的線程上並行執行。)第二個缺點是默認情況下緩存了變量的讀取,因此在程序中update_bupdate_b (即c + a )可以使用原來的或更新后的值a ,這取決於當變量被首先讀出。

如果要確保以特定順序執行操作,可以使用with tf.control_dependencies([...]):塊來強制執行在塊中創建的操作在列表中指定的操作之后發生。 您可以在with tf.control_dependencies([...]): block中使用tf.Variable.read_value()來顯示變量讀取的點。

因此,如果您想確保update_aupdate_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) 因此,它插入vc的值,得到add的值為3。

好的,現在我們需要update的值,定義為tf.assign(v, add) 我們有兩個add值(它現在計算為3)和v 因此,它將v的值update為3,這也是update的值。

現在,它的addupdate值都是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM