TensorFlow入門-04.TensorFlow變量與神經網絡參數

0.TensorFlow中的變量

    |- 函數介紹:

        |- tf.Variable:TensorFlow中的變量聲明函數

        |- tf.random_normal:

            |- TensorFlow中的隨機數(正態分佈)矩陣生成函數

            |- 例子:tf.random_normal([行數, 列數], stddev=標準差, mean=均值)  (均值可以省略,默認值爲0)

    |- 實例:聲明一個矩陣變量

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

        |- 該矩陣變量爲一個2x3的隨機數矩陣

        |- 這些隨機數的均值爲0,標準差爲2.

1.通過隨機數來創建變量

TensorFlow中的隨機數生成函數

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

2.通過常數來創建變量

常用常量聲明方法

函數名稱 功能 樣例
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]))

以上代碼將生成一個名爲“biases”的變量,它的內容是一個 “一行3列的全0矩陣”:[0, 0, 0]

3.通過其他變量來創建變量

weights = tf.Variable(tf.random_normal([2, 3], stddev=2)) # 通過隨機數創建變量
w2 = tf.Variable(weights.initialized_value())             # 通過已有變量“weights”創建變量
w3 = tf.Variable(weights.initialized_value() * 2.0)       # 通過已有變量“weights”創建變量

4.變量的初始化

變量在使用之前還需要對其進行初始化。

sess.run(weights.initializer)  # 初始化weighs
sess.run(w2.initializer)       # 初始化w2
sess.run(w3.initializer)       # 初始化w3

5.完整樣例

通過變量實現神經網絡的參數並實現前向傳播。

# 1.導入模塊
import tensorflow as tf

# 2.聲明變量
# 聲明w1,w2隨機數矩陣變量,標準差爲1,種子爲1(在函數tf.random_normal()中,可以設置“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))

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

# 4.定義計算
# 通過前向傳播算法獲得神經網絡的輸出
a = tf.matmul(x, w1) # 特徵矩陣 * 第一層權重矩陣
y = tf.matmul(a, w2) # 第一隱藏層的輸出矩陣 * 第二層權重矩陣

# 5.創建會話
sess = tf.Session()

# 6.在會話中初始化變量
sess.run(w1.initializer) # 初始化變量w1
sess.run(w2.initializer) # 初始化變量w2

# 7.執行計算並輸出結果
print(sess.run(y))

# 8.關閉會話
sess.close()

6.在會話中對變量做統一初始化

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

7.變量操作實現細節

前向傳播樣例中的變量w1的操作細節

random_n... -> Assign -> w1 -> read -> MatMul

隨機數生成 -> Assign函數 -> 產生w1變量 -> read函數 -> MatMul函數

8.集合(collection)

所有的變量都會被自動地加入到GraphKeys.VARIABLES這個集合中。

獲取當前計算圖上的所有變量

    |- 函數:tf.global_variables()

    |- 作用:拿到當前計算圖上的所有變量,這有助於持久化整個計算圖的運行狀態。

9.需要優化的參數和其他參數

在構建機器學習模型,比如神經網絡時,可以通過變量聲明函數中的trainable參數來區分需要優化的參數(比如神經網絡中的參數)和其他參數(比如迭代輪數)。

    |- 當trainable爲True:該參數爲需要優化的參數。該變量聲明之後會被加入到GraphKeys.TRAINABLE_VARIABLES集合。

        |- 獲取所有需要優化的參數:tf.trainable_variables

        |- TensorFlow中提供的神經網絡優化算法會將GraphKeys.TRAINABLE_VARIABLES集合中的變量作爲默認的優化對象。

    |- 當trainable爲False:該參數是其他參數。

10.變量的維度(shape)和類型(type)

變量是張量的其中一種,所以變量也有維度和類型。

函數介紹:

    |- 賦值函數assign():tf.assign(w1, w2)  《==等價於==》w1.assign( w2),意思是:將w2的值賦值給w1。

10.1 變量的類型不可改變

    |- 變量的類型是不能改變的:一個變量在構建之後,它的類型就不能再被改變。

    |- random_normal的返回值類型默認爲:tf.float32。

w1 = tf.Variable(tf.random_normal([2, 3], stddev=1), name="w1")
w2 = tf.Variable(tf.random_normal([2, 3],dtype=tf.float64, stddev=1), name="w2")
w1.assign(w2)

    |- 由於w1的數據類型是默認的tf.float32而w2是指定的tf.float64,所以語句“w1.assign(w2)”在執行時會報錯。

10.2 變量的維度可以改變

    |- 將參數置否validate_shape=False,維度可以修改。

import tensorflow as tf
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1), name="w1")
w2 = tf.Variable(tf.random_normal([2, 2], stddev=1), name="w2")
tf.assign(w1, w2, validate_shape=False) # 當參數的數量大於兩個時,需要用tf.的方式調用。

若不設置,則會報錯:

import tensorflow as tf
w1 = tf.Variable(tf.random_normal([2, 3], stddev=1), name="w1")
w2 = tf.Variable(tf.random_normal([2, 2], stddev=1), name="w2")
w1.assign(w2)  # 等價於:tf.assign(w1, w2)
# 報錯:
ValueError: Dimension 1 in both shapes must be equal, but are 3 and 2 for 'Assign' (op: 'Assign') with input shapes: [2,3], [2,2].

 

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