【tensorflow】tf.Variable、tf.constant、tf.placeholder
張量(Tensor)是TensorFlow的核心資料單位。一個張量由一組形成陣列(任意維數)的原始值組成。張量的階是它的維數,而它的形狀是一個整數元組,指定了陣列每個維度的長度。
下面會介紹 Tensorflow 中幾個特殊張量:
- tf.Variable
- tf.constant
- tf.placeholder
tf.Variable
Tensorflow 變數是表示程式處理的共享持久狀態的最佳方法。
建立變數
建立變數的最佳方式是呼叫 tf.get_variable
函式。此函式需要指定變數的名字與形狀。
# 建立名為‘variable_a’,形狀為[1,2,3]的3維張量
variable_a = tf.get_variable("a",shape=[1,2,3])
tf.get_variable
還可以指定資料型別(預設的是 tf.float32)和初始化器。Tensorflow 提供了許多方便的初始化器,比如
tf.zeros_initializer
初始化為0
variable_b = tf.get_variable("b", shape=[1, 2, 3], dtype=tf.float32, initializer=tf.zeros_initializer)
tf.constant_initializer
初始化為常量
value = np.array([0, 1, 2, 3, 4, 5, 6, 7]) variable_c = tf.get_variable("c", dtype=tf.float32, shape=value.shape, initializer=tf.constant_initializer(value))
tf.truncated_normal_initializer
隨機初始化
variable_d = tf.get_variable('d', dtype=tf.float32, shape=[4, 3, 4
tf.contrib.layers.xavier_initializer
隨機初始化
variable_e = tf.get_variable('e', dtype=tf.float32, shape=[4, 3, 4], initializer=xavier_initializer())
此處介紹幾種常見的初始化器,其中在初始化方面使用比較多的是後兩種,建議使用
xavier_initializer初始化器
,之前在用 lstm模型進行文字分類過程中,使用truncated_normal_initializer
進行初始化,發現在訓練過程中,lstm 模型執行少數batch後就收斂,致使模型在訓練集和測試集上的準確率都很低。當然,這個也不絕對,具體還是要根據自己的模型而定。
初始化變數
變數必須先初始化後才可使用。在低級別的程式設計中,需要明確初始化,高級別框架下是自動初始化的。此處介紹下低級別程式設計中初始化的問題。
指定初始化某個變數
sess=tf.Session() sess.run(tf.initialize_variables([variable_c]))
在變數比較少的模型中,使用上述方法是很 ok 的,但是在變數比較多的情況下,使用上述方法可能會很不爽,至少對我是這樣的。
初始化全部變數
sess.run(tf.initialize_all_variables())
tf.constant
使用tf.constant來建立一個常量。
```
# 建立0維常量
tf.constant(0.2,name='a')
# 建立1維常量
tf.constant([1,2,3,4],name='b')
tf.constant(-1.0, shape=[2, 3], name='b')
```
tf.placeholder
此函式的作用可以作為 java 方法中的形參,用於定義過程,在方法執行時再賦予具體的值。
a = tf.placeholder(dtype=tf.float32, shape=None, name='a')
b = tf.placeholder(dtype=tf.float32, shape=None, name='b')
with tf.Session() as sess:
print(sess.run(a + b, feed_dict={a: 1, b: 2}))