---恢復內容開始---
當我們編寫tensorflow代碼時, 總是定義好整個計算圖,然后才調用sess.run()去執行整個定義好的計算圖, 那么有兩個問題:一是當執行sess.sun()的時候, 程序是否執行了計算圖上的所有節點呢?二是sees.run()中的fetch, 為了取回(Fetch)操作的輸出內容, 我們在sess.run()里面傳入tensor, 那這些tensor的先后順序會影響最后的結果嘛?比如有些tensor是有先后執行關系的,如果置於后面,會重復計算嘛? 請看實驗: import tensorflow as tfstate = tf.Variable(0.0,dtype=tf.float32)
one = tf.constant(1.0,dtype=tf.float32)
new_val = tf.add(state, one)
update = tf.assign(state, new_val) #返回tensor, 值為new_val
update2 = tf.assign(state, 10000) #沒有fetch,便沒有執行
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for _ in range(3):
print(sess.run([update,state, new_val]))
print("--------")
程序輸出的結果為:
[1.0, 1.0, 1.0]
[2.0, 2.0, 2.0]
[3.0, 3.0, 3.0]
從結果可知:
首先, update2這個tensor並沒有執行,因為它不在sess.run()的fetch列表中。
對於sess.sun(fetch), 只有fetch里的圖元素, 才會被執行, 不在fetch中的圖節點是不會執行的
其次, 當我們將sess.run()里面的fetch列表中的節點打亂時, 取出來的值依然是一次流程圖計算出來的結果
當sess.run() 里面的fetch是一個list時, 無論是update在前, 還是state在前, 不會執行update之后看到state在update后面就在執行一次state, 都是在這個list中的節點在流程圖中全部執行完之后在取值的。
在看實驗:
import tensorflow as tf
state = tf.Variable(0.0,dtype=tf.float32)
one = tf.constant(1.0,dtype=tf.float32)
new_val = tf.add(state, one) # 1
update = tf.assign(state, new_val) #返回tensor, 值為new_val #update 1 # state 1
update2 = tf.assign(state, 10000) #沒有fetch,便沒有執行 # update2 10000 # state 10000
init = tf.initialize_all_variables()
with tf.Session() as sess:
sess.run(init)
for _ in range(1):
print(sess.run([state, new_val, update2, update]))
print("--------")
結果為:
[10001.0, 10001.0, 10001.0, 10001.0]
分析: 程序不是從上到下依次執行的, tensorflow里面是按照計算圖而流動計算的, 畫出程序的計算圖就可以知道, 最先開始執行的操作是update2這個節點, 然后是add這個節點。 最后tf.assign()是當流程圖都走完之后進行取值的
---恢復內容結束---