Tensorflow的設計理念稱之為計算流圖,在編寫程序時,首先構筑整個系統(tǒng)的graph,代碼并不會直接生效,這一點和python的其他數(shù)值計算庫(如Numpy等)不同,graph為靜態(tài)的,類似于docker中的鏡像。然后,在實際的運行時,啟動一個session,程序才會真正的運行。這樣做的好處就是:避免反復地切換底層程序實際運行的上下文,tensorflow幫你優(yōu)化整個系統(tǒng)的代碼。我們知道,很多python程序的底層為C語言或者其他語言,執(zhí)行一行腳本,就要切換一次,是有成本的,tensorflow通過計算流圖的方式,幫你優(yōu)化整個session需要執(zhí)行的代碼,還是很有優(yōu)勢的。
上面扯了許多很虛的東西,接下來引入本文的主角:feed_dict。剛學tensorflow的時候,以為feed_dict是和placeholder配對使用的。比如下面的代碼,說明了feed_dict的基本用法:
import tensorflow as tf
a = tf.placeholder(dtype=tf.float32)
b = tf.placeholder(dtype=tf.float32)
c = tf.add(a, b)
with tf.Session() as sess:
print sess.run(c, feed_dict = {a: 1.0, b: 2.0})
OK, 其實feed_dict可以喂東西給其他tensor,不止placeholder這一種。例如,下面的代碼:
import tensorflow as tf
a = tf.placeholder(dtype=tf.float32)
b = tf.constant(2.0)
c = tf.add(a, b)
with tf.Session() as sess:
print sess.run(c, feed_dict = {a: 1.0, b: 3.0})
運行的結果為4,這里利用feed_dict將3.0送給了tensor b。
總結一下,知道了這種原理,對于模型恢復的理解很有幫助。機器學習系統(tǒng)伴隨著tensor的流動(tensorflow的寓意即為此,神經(jīng)網(wǎng)絡等等,其實就是tensor的線性變換和非線性激活),也許,我們只拿到了中間的tensor。舉例而言,你在做圖片分類的工作,訓練過程中,graph的placeholder為任意size的像素矩陣,但當你恢復模型的時候,已經(jīng)有預處理完的圖片像素tensor,這時就可以直接將其導入對應的tensor中即可,前提是知道對應的tensor的name或者符號,此時或許需要用到tf.get_tensor_by_name這個函數(shù)。feed_dict的靈活運用,也能反映出對graph思想理解。
若有不對之處,請大神指教。轉載請注明出處,謝謝。