tensorflow 中變數的初始值可以設定成隨機數、常數或者是通過其他變數的初始值計算得到。
通過滿足正態分佈的隨機數來初始化神經網路中的引數是乙個非常常用的方法,除了正態分佈的隨機數,tensorflow 還提供了一些其他的隨機數生成器:
tensorflow 也支援通過常數來初始化乙個變數:
在神經網路中,偏置項(bias)通常會使用常數來設定初始值。
biases = tf.variable(tf.zeros([3])) # 生成乙個初始值全部為0且長度為3的變數。
除了使用隨機數或者常數,tensorflow 也支援通過其他變數的初始值來初始化新的變數。
# w2的初始值被設定成了與weights變數相同。
w2 = tf.variable(weights.initialized_value())
# w3的初始值則是weights初始值的兩倍。
w3 = tf.variable(weights.initialized_value() * 2.0)
在 tensorflow 中,乙個變數的值在被使用之前,這個變數的初始化過程需要被明確地呼叫。通過變數實現神經網路的引數並實現前向傳播:
import tensorflow as tf
"""
宣告wl、w2兩個變數。這裡還通過seed引數設定了隨機種子,
這樣可以保證每次執行得到的結果是一樣的。
""""""
當宣告了變數wl、w2之後,可以通過wl和w2來定義神經網路的前向傳播過程並得到中間結果a和最後答案y。
定義wl、w2, a和y的過程對應了tensorflow程式的第一步。
這一步定義了tensorflow計算圖中所有的計算,但這些被定義的計算在這一步中並不真正地執行。
當需要執行這些計算並得到具體數字時,需要進入tensorflow程式的第二步。
"""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)
"""
在tensorflow程式的第二步會宣告乙個會話(session),並通過會話計算結果。
當會話定義完成之後就可以開始真正執行定義好的計算了。
但在計算y之前,需要將所有用到的變數初始化。
也就是說,雖然在變數定義時給出了變數初始化的方法,但這個方法並沒有被真正執行。
所以在計算y之前,需要通過執行w1.initializer和w2.initializer來給變數賦值。
"""sess = tf.session()
# 第一種方法,不主張
"""
這裡不能直接通過sess.run(y)來獲取y的取值,
因為wl和w2都還沒有執行初始化過程。
以下兩行分別初始化了wl和w2兩個變數。
sess.run(w1.initializer) # 初始化w1。
sess.run(w2.initializer) # 初始化w2。
"""# 第二種方法,常用
init_op = tf.global_variables_initializer()
sess.run(init_op)
# 輸出[[ 3.95757794]]。
print(sess.run(y))
sess.close()
在 tensorflow 中,變數的宣告函式 tf.variable 是乙個運算,這個運算的輸出結果就是乙個張量,這個張量也就是變數,所以變數只是一種特殊的張量。通過 tf.global_variables()函式可以拿到當前計算圖上所有的變數。
類似張量,維度(shape)和型別 (type)也是變數最重要的兩個屬性。和大部分程式語言類似,變數的型別是不可改變的。乙個變數在構建之後,它的型別就不能再改變了。維度是變數另乙個重要的屬性。和型別不大一樣的是,維度在程式執行中是有可能改變的,但是需要通過設定引數 validate_shape=false。雖然 tensorflow 支援更改變數的維度,但是這種用法在實踐中比較罕見。
演算法工程師修仙之路 TensorFlow(二)
張量在 tensorflow 中的實現並不是直接採用陣列的形式,它只是對tensorflow 中運算結果的引用。在張量中並沒有真正儲存數字,它儲存的是如何得到這些數字的計算過程。tensorflow中的張量和 numpy 中的陣列不同,tensorflow 計算的結果不是乙個具體的數字,而且乙個張量...
演算法工程師修仙之路 TensorFlow(五)
乙個最簡單的神經元結構的輸出就是所有輸入的加權和,而不同輸入的權重就是神經元的引數。神經網路的優化過程就是優化神經元中引數取值的過程。全連線神經網路是相鄰兩層之間任意兩個節點之間都有連線的神經網路結構。乙個簡單的判斷零件是否合格的三層全連線神經網路。第二個部分為神經網路的連線結構。最後乙個部分是每個...
演算法工程師修仙之路 Keras(三)
由於這一領域是靠實驗結果而不是理論指導的,所以只有當合適的資料和硬體可用於嘗試新想法時 或者將舊想法的規模擴大,事實往往也是如此 才可能出現演算法上的改進。機器學習不是數學或物理學,靠一支筆和一張紙就能實現重大進展。它是一門工程科學。硬體 資料如果有乙個資料集是深度學習興起的催化劑的話,那麼一定是 ...