原址:https://www.2cto.com/kf/201610/559887.html
session.run()
session.run([fetch1, fetch2])
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)
update = tf.assign(state, new_val)
init = tf.initialize_all_variables()
with tf.Session() as sess:sess.run(init)for _ in range(10):u,s = sess.run([update,state])print s
在我的電腦上輸出是 0.0, 2.0, 3.0, 4.0, 5.0, 5.0, 6.0, 8.0, 9.0, 10.0
是不是很奇怪為什么輸出的不是0.0–9.0, 或1.0–10.0
我的猜測是:底層在fectch這兩個值的時候,是并行運算的,第一次:程序先fetch “state”的值,然后fetch “update”(導致了assign op)。 第二次,程序先fetch “update”(導致了 assign op),然后fetch “state” . 所以導致了第一次輸出是0.0, 第二次輸出是2.0.
注:(update op 更新state的值, 而我在fetch update 的同時也fetch 了state, 只有在這種情況下才會出現上述的問題。 如果我不fetch state ,而去fetch add1的話, 就不會出現上述問題,可見底層是先更新了state的值,才去計算add1。這樣的話我們經常使用的代碼sess.run([train_op, loss]),獲取的loss就是train_op執行完之后的loss了)
執行sess.run()時,tensorflow是否計算了整個圖
我們在編寫代碼的時候,總是要先定義好整個圖,然后才調用sess.run()。那么調用sess.run()的時候,程序是否執行了整個圖
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)
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)
和上個程序差不多,但我們這次僅僅是fetch “update”,輸出是1.0 , 2.0, 3.0,可以看出,tensorflow并沒有計算整個圖,只是計算了與想要fetch 的值相關的部分
sess.run() 中的feed_dict
我們都知道feed_dict的作用是給使用placeholder創建出來的tensor賦值。其實,他的作用更加廣泛:feed 使用一個 值(不能是tensor,可以是tensor.eval())臨時替換一個 op 的輸出結果. 你可以提供 feed 數據作為 run() 調用的參數. feed 只在調用它的方法內有效, 方法結束, feed 就會消失.
y = tf.Variable(1)
with tf.Session() as sess:tf.initialize_all_variables().run()print sess.run(y,feed_dict={y:3}) #使用3 替換掉tf.Variable(1)的輸出結果,所以打印出來3print sess.run(y) #由于feed只在調用他的方法范圍內有效,所以這個打印的結果是 1
?