1.placeholder 機制
- placeholder 機制的作用
網(wǎng)絡(luò)的輸入數(shù)據(jù)是一個矩陣,我們把多個這樣的矩陣數(shù)據(jù)打包成一個很大的數(shù)據(jù)集,如果將這個數(shù)據(jù)集當(dāng)作變量或常量一下子輸入到網(wǎng)絡(luò)中,那么就需要定義很多的網(wǎng)絡(luò)輸入常量,于是計算圖上將會涌現(xiàn)大量的輸入節(jié)點。這是不利的,這些節(jié)點的利用率很低。
placehoder 機制被設(shè)計用來解決這個問題。編程時只需要將數(shù)據(jù)通過 placeholder 傳入 TensorFlow 計算圖即可。
- 使用
tf.placeholder()
import tensorflow as tf
a = tf.placeholder(tf.float32,shape=(2),name="input")
b = tf.placeholder(tf.float32,shape=(2),name="input")
result = a+b
with tf.Session() as sess :
sess.run(result,feed_dict={a:[1.0,2.0],b:[3.0,4.0]})
print(result)
#輸出[4.,6.]
在 placeholder 定義時,這個位置上的數(shù)據(jù)類型
dtype是需要指定且不可以改變的。 placeholder 中數(shù)據(jù)的維度信息shape可以根據(jù)提供的數(shù)據(jù)推導(dǎo)得出,所以不一定要給出;或者對于不確定的維度,填入None即可。
這里輸入a和b定義為常量,這里將它們定義為一個tf.placeholder(),在運行會話時需要通過sess.run()函數(shù)的feed_dict來提供a和b的取值。feed_dict是一個字典dict,在字典中需要給出每個用到的placeholder的取值。
2.Varibale變量
-
tf.Variable()創(chuàng)建變量
tf.Variable(initial_value,
trainable=True,
collections=None,
validate_shape=True,
name=None)
| 參數(shù)名稱 | 參數(shù)類型 | 含義 |
|---|---|---|
| initial_value | 所有可以轉(zhuǎn)換為Tensor的類型 | 變量的初始值,一般是隨機生成函數(shù)的值 |
| trainable | bool | 是否加入到GraphKeys.TRAINABLE_VARIABLES被迭代優(yōu)化 |
| collections | list | 指定該圖變量的類型、默認(rèn)為GraphKeys.GLOBAL_VARIABLES
|
| validate_shape | bool | 是否進(jìn)行類型和維度檢查 |
| name | string | 變量的名稱,如果沒有指定則系統(tǒng)會自動分配一個唯一的值 |
- 在
sess對變量運算前初始化所有變量
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
- 管理變量的變量空間
with tf.variable_scope("one") :
a = tf.get_variable ("a",shape=[1],initializer=tf.constant_initializer(1.0))
- 以上代碼在名為
one的變量空間內(nèi)創(chuàng)建名字為a的變量;- 因為
tf.variable_scope("one")的參數(shù)默認(rèn)reuse=False,所以在one這個變量空間內(nèi)不能在創(chuàng)建名字為a的變量;- 若
reuse=True則get_variable()函數(shù)會直接獲取name屬性相同的己經(jīng)創(chuàng)建的變量,獲取的變量沒創(chuàng)建過則會報錯(區(qū)別于指定initializer時為創(chuàng)建新變量)