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中的隨機數生成函數
函數名稱 | 隨機數分佈 | 主要參數 |
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].