1. 程式人生 > >【tensorflow】tf.Variable、tf.constant、tf.placeholder

【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
    ], initializer=tf.truncated_normal_initializer)
  • 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}))