【TensorFlow】占位符:tf.placeholder,与feed_dict
Tensorflow中的placeholder和feed_dict的使用_python_ https://www.jb51.net/article/143407.htm
- TensorFlow 支持占位符placeholder。占位符并沒有初始值,它只會分配必要的內存。在會話中,占位符可以使用 feed_dict 饋送數據。
- feed_dict是一個字典,在字典中需要給出每一個用到的占位符的取值。
在訓練神經網絡時需要每次提供一個批量的訓練樣本,如果每次迭代選取的數據要通過常量表示,那么TensorFlow 的計算圖會非常大。因為每增加一個常量,TensorFlow 都會在計算圖中增加一個結點。所以說擁有幾百萬次迭代的神經網絡會擁有極其龐大的計算圖,而占位符卻可以解決這一點,它只會擁有占位符這一個結點。
TensorFlow占位符:tf.placeholder_w3cschool https://www.w3cschool.cn/tensorflow_python/tensorflow_python-w7yt2fwc.html
tf.placeholder 函數:
插入一個張量的占位符,這個張量將一直被提供.
placeholder(dtype, #數據類型。常用的是tf.float32,tf.float64等數值類型shape=None,#數據形狀。默認是None,就是一維值,也可以是多維(比如[2,3], [None, 3]表示列是3,行不定)name=None #名稱 )注意:如果直接計算,該張量將產生一個錯誤,
其值必須使用 feed_dict 可選參數來進行 session . run()、Tensor.eval() 或 oper.run().
例如:
x = tf.placeholder(tf.float32, shape=(1024, 1024)) y = tf.matmul(x, x)with tf.Session() as sess:print(sess.run(y)) # ERROR: will fail because x was not fed.rand_array = np.random.rand(1024, 1024)print(sess.run(y, feed_dict={x: rand_array})) # Will succeed.結果:
直接使用第一個print(),將會報錯。
注釋掉第一個print(),只使用第二個print(),可以得到輸出:
為什么要用placeholder?
Tensorflow的設計理念稱之為計算流圖,在編寫程序時,首先構筑整個系統的graph,代碼并不會直接生效,這一點和python的其他數值計算庫(如Numpy等)不同,graph為靜態的,類似于docker中的鏡像。然后,在實際的運行時,啟動一個session,程序才會真正的運行。這樣做的好處就是:避免反復地切換底層程序實際運行的上下文,tensorflow幫你優化整個系統的代碼。我們知道,很多python程序的底層為C語言或者其他語言,執行一行腳本,就要切換一次,是有成本的,tensorflow通過計算流圖的方式,幫你優化整個session需要執行的代碼,還是很有優勢的。
所以placeholder()函數是在神經網絡構建graph的時候在模型中的占位,此時并沒有把要輸入的數據傳入模型,它只會分配必要的內存。等建立session,在會話中,運行模型的時候通過feed_dict()函數向占位符喂入數據。
placeholder有點像在定義函數的時候用到的參數。我們在寫函數內部代碼的時候,雖然用到了參數,但并不知道參數所代表的值。只有在調用函數的時候,我們才把具體的值傳遞給參數。
feed_dict() 函數
我們都知道feed_dict的作用:是給使用placeholder創建出來的tensor賦值。
剛學tensorflow的時候,以為feed_dict是和placeholder配對使用的。比如下面的代碼,說明了feed_dict的基本用法:
其實feed_dict可以喂東西給其他tensor,不止placeholder這一種。例如,下面的代碼:
import tensorflow as tfa = 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。
總結一下,知道了這種原理,對于模型恢復的理解很有幫助。機器學習系統伴隨著tensor的流動(tensorflow的寓意即為此,神經網絡等等,其實就是tensor的線性變換和非線性激活),也許,我們只拿到了中間的tensor。
舉例而言,你在做圖片分類的工作,訓練過程中,graph的placeholder為任意size的像素矩陣,但當你恢復模型的時候,已經有預處理完的圖片像素tensor,這時就可以直接將其導入對應的tensor中即可,前提是知道對應的tensor的name或者符號,此時或許需要用到tf.get_tensor_by_name這個函數。feed_dict的靈活運用,也能反映出對graph思想理解。
原文:
https://blog.csdn.net/kdongyi/article/details/82343712
https://www.jianshu.com/p/ec261a65e3c9
總結
以上是生活随笔為你收集整理的【TensorFlow】占位符:tf.placeholder,与feed_dict的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何提高蚂蚁借呗额度
- 下一篇: 【numpy】中,对axis【轴】axi