1. 程式人生 > >tensorflow學習筆記(1):sess.run()

tensorflow學習筆記(1):sess.run()

原址: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)的輸出結果,所以打印出來3
    print sess.run(y)  #由於feed只在呼叫他的方法範圍內有效,所以這個列印的結果是 1