TensorFlow入門(四) 神經網絡參數與TensorFlow變量

神經網絡中的參數是神經網絡實現分類或者回歸問題中重要的部分。在TensorFlow中,變量(tf.Variable)的作用就是保存和更新神經網絡中的參數。和其他編程語言類似,TensorFlow中的變量也需要指定初始值。因爲在神經網絡中,給參數賦予隨機初始值最爲常見,所以一般也使用隨機數給TensorFlow中的變量初始化。下面一段代碼給出了一種在TensorFlow中聲明一個2x3的矩陣變量的方法:

weights = tf.Variable(tf.random_normal([2, 3], stddev=2))

這段代碼調用了TensorFlow變量的聲明函數tf.Variable。在變量聲明函數中給出了初始化這個變量的方法。TensorFlow中變量的初始值可以設爲隨機數、常數或者是通過其他變量的初始計算得到。在上面的樣例中,tf.random_normal([2, 3], stddev=2)會產生一個2x3的矩陣,矩陣中的元素是均值爲0,標準差爲2的隨機數。tf.random_normal函數可以通過參數mean來指定平均值,在沒有指定時默認爲0.通過滿足正太分佈的隨機數來初始化神經網絡中的參數是一個非常常用的方法。除了正太分佈的隨機數,TensorFlow還提供了一些其他的隨機數生成器。

TensorFlow隨機數生成函數
函數名稱 隨機函數分佈 主要參數
tf.random_normal 正態分佈 平均值、標準差、取值類型
tf.truncated_normal 正態分佈,但如果隨機出來的值偏離平均值超過2個標準差,那麼這個數將會被重新隨機 平均值、標準差、取值類型
tf.random_uniform 平均分佈 最小、最大取值,取值類型
tf.random_gamma Gamma分佈

形狀參數alpha,尺度參數beta,取值類型

TensorFlow也支持通過常數來初始化一個變量。

TensorFlow常數生成函數
函數名稱 功能 樣例
tf.zeros 生成全0的數組 tf.zeros([2, 3], int32) -> [[0, 0, 0], [0, 0, 0]]
tf.ones 生成全1的數組 tf.ones([2, 3], int32) -> [[1, 1, 1], [1, 1, 1]]
tf.fill 產生一個全部爲給定數字的數組 tf.fill([2, 3], 9) -> [[9, 9, 9], [9, 9, 9]]
tf.constant 產生一個給定值的常量 tf.constant([1, 2, 3]) -> [1, 2, 3]

在神經網絡中,偏置量(bias)通常會使用常數來設置初始值。以下代碼給出了一個樣例。

biases = tf.Variable(tf.zeros([3]))

這段代碼會生成一個初始值全部爲0且長度爲3的變量。除了使用隨機數或者常數,TensorFlow也支持通過其他變量的初始值來初始化新的變量。以下代碼給出了具體的方法。

w2 = tf.Variable(weights.initialized_value())
w3 = tf.Variable(weights,initialized_value() * 2.0)

以上代碼中,w2的初始值被設置成了與weights變量相同。w3的初始值則是weights初始值的兩倍。在TensorFlow中,一個變量的值在使用之前,這個變量的初始化過程需要被明確地調用。以下樣例介紹瞭如何通過變量實現神經網絡的參數並實現前向傳播的過程。

import tensorflow as tf

# 聲明w1、w2兩個變量。這裏通過seed參數設定了隨機種子,
# 這樣可以保證每次運行得到的結果是一樣的
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1, seed=1))
w2 = tf.Variable(tf.random_normal([3, 1], stddev=1, seed=1))

# 暫時將輸入的特徵值定義爲一個常量。這裏x是一個1*2的矩陣
x = tf.constant([[0.7, 0.9]])

# 通過前向傳播算法獲得神經網絡的輸出
a = tf.matmul(x, w1)
y = tf.matmul(a, w2)

sess = tf.Session()
# 這裏不同直接通過sess.run(y)來獲取y的取值,
# 因爲w1和w2都還沒有運行初始化過程,下面進行初始化
sess.run(w1.initializer) # 初始化x1
sess.run(w2.initializer) # 初始化w2
# 輸出[[3.957578]]
print(sess.run(y))
sess.close()

定義變量,也就是定義了TensorFlow計算圖中所有的計算。但這些被定義的計算在這一步並不真正的運行。當需要運行這些計算並得到具體數字時,需要聲明一個會話(session),並通過會話計算結果。但在計算之前,需要將將所有使用到的變量初始化。也就是說,雖然變量定義時給出了變量初始化的方法,但這個方法並沒有真正運行。所以在計算y之前,需要通過運行w1.initializer和w2.initializer來給變量賦值。雖然直接調用每個變量的初始化過程是一個可行的方案,但是當變量數目增多,或者變量之間存在依賴關係時,單個調用的方案就比較麻煩了。爲了解決這個問題,TensorFlow提供了一種更加便捷的方式來完成變量初始化的過程。下面的程序展示了通過tf.initialize_all_variables函數來實現初始化所有變量的過程。

init_op = tf.initialize_all_variables()
sess.run(init_op)

通過tf.initialize_all_variables函數,就不需要將變量一格格初始化了。這個函數也會自動處理變量之間的依賴關係。

TensorFlow的核心概念是張量(tensor),所有的數據都是通過張量的形式來組織的。在TensorFlow中,變量的聲明函數tf.Variable是一個運算。這個運算的輸出結果就是一個張量,這個張量也就是本篇所介紹的變量。所以變量只是一種特殊的張量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章