tensorflow學習(3):初始化
一、隨機數生成函式
-
tf.truncated_normal(shape, mean, stddev)
shape表示生成張量的維度,mean是均值,stddev是標準差。這個函式產生正太分佈(嚴格的說是高斯分佈),均值和標準差自己設定。
這是一個截斷的產生正太分佈的函式,就是說產生正太分佈的值如果與均值的差值大於兩倍的標準差,那就重新生成。
和一般的正太分佈的產生隨機資料比起來,這個函式產生的隨機數與均值的差距不會超過兩倍的標準差,但是一般的別的函式是可能的。 -
tf.random_normal(shape, mean, stddev,seed) ,和上面的tf.truncated_normal區別是:
tf.truncated_normal的輸出如字面意思是截斷的,而截斷的標準是2倍的stddev。
舉例,當輸入引數mean = 0 , stddev =1時,
使用tf.truncated_normal的輸出是不可能出現[-2,2]以外的點的,
而如果shape夠大的話,tf.random_normal卻會產生2.2或者2.4之類的輸出。
注:將seed設定成相同的值,會導致幾次隨機產生的值是相同的 -
tf.random_uniform():平均分佈;需要指定最大值,最小值,取值型別
-
tf.random_gamma():gamma分佈
需要指定形狀引數alpha,尺度引數beta,取值型別需要指定形狀引數alpha,尺度引數beta,取值型別
二、常數生成函式
相比於隨機數生成函式,常數生成函式的引數要簡單很多,而且容易記憶(不過在隨機數生成函式裡面,一般用的比較多的也就是正態分佈,也只需要記憶均值和方差即可,而且一般初始化的時候都希望均值為0)
常數生成函式引數一般為2個,shape和型別
函式名稱 | 功能 | 樣例 |
---|---|---|
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.zeros([2,3],9)–>[[9,9,9],[9,9,9]] |
tf.constant | 產生一個給定值的常量 | tf.constant([1,2,3])–>[1,2,3] |
三、其他
雖然在變數定義時給出了變數初始化的方法,但這個方法並沒有被真正執行,此時保留在tensor中的並沒有數字,而只是保留了shape,type,name這三個關鍵元素,要執行初始化,tensorflow提供 了一個函式:
tf.global_variables_initializer()
雖然非常長,但是根據字面意思還是能記憶的。
如下是一個完整的初始化方式:(假設是一個三層網路)
import tensorflow as tf
w1 = tf.Variables(tf.random_normal([2,3]))
w2 = tf.Variables(tf.random_normal([3,1]))
x = tf.constant([10,20])
a = tf.matmul(x,w1)
y = tf.matmul(a,w2)
with tf.Session() as sess:
init_op = tf.global_variables_initialized()
sess.run(y) #輸出y值