利用tf.truncated_normal與tf.random_normal進行張量初始化的詳解

tf.truncated_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None


截斷的正態分佈中輸出隨機值。
生成的值服從具有指定平均值和標準偏差的正態分佈,如果生成的值大於平均值2個標準偏差的值則丟棄重新選擇


在正態分佈的曲線中,橫軸區間(μ-σ,μ+σ)內的面積爲68.268949%。
橫軸區間(μ-2σ,μ+2σ)內的面積爲95.449974%。
橫軸區間(μ-3σ,μ+3σ)內的面積爲99.730020%。
X落在(μ-3σ,μ+3σ)以外的概率小於千分之三,在實際問題中常認爲相應的事件是不會發生的,基本上可以把區間(μ-3σ,μ+3σ)看作是隨機變量X實際可能的取值區間,這稱之爲正態分佈的“3σ”原則。
在tf.truncated_normal中如果x的取值在區間(μ-2σ,μ+2σ)之外則重新進行選擇。這樣保證了生成的值都在均值附近。


參數說明:

  • shape: 一維的張量,也是輸出的張量。
  • mean: 正態分佈的均值。
  • stddev: 正態分佈的標準差。
  • dtype: 輸出的類型。
  • seed: 一個整數,當設置之後,每次生成的隨機數都一樣。
  • name: 操作的名字。

參考程序:

weights1 = tf.truncated_normal([5,3], mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
weights2 = tf.truncated_normal([4,3], mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
weights3 = tf.truncated_normal([4,3], mean=1.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
weights4 = tf.truncated_normal([4,3], mean=1.0, stddev=0.1, dtype=tf.float32, seed=None, name=None)
weights5 = tf.truncated_normal([4,3], mean=1.0, stddev=0.1, dtype=tf.float32, seed=None, name=None)
weights6 = tf.truncated_normal([4,3], mean=1.0, stddev=0.1, dtype=tf.float32, seed=1, name=None)
weights7 = tf.truncated_normal([4,3], mean=1.0, stddev=0.1, dtype=tf.float32, seed=1, name='weights')

with tf.Session() as sess:
    wei = sess.run([weights1, weights2, weights3, weights4, weights5, weights6, weights7])
    print(wei[0], '\n\n', wei[1],'\n\n', wei[2], '\n\n', wei[3], '\n\n', wei[4], '\n\n', wei[5], '\n\n', wei[6])

輸出結果:

[[-0.40593258 -1.01910961 -0.42552167]
 [-0.37542778  1.21473289 -1.00073791]
 [ 0.15493505  1.98509014 -0.44988221]
 [-0.16089663 -0.81307292  1.75576675]
 [ 1.49424899  0.53253829 -0.44933572]] 

 [[ 1.13885188  1.2209971   0.72404194]   注:改變shape大小(相對於前一個,以下同此)
 [-0.63705486  0.94489962  1.10668516]
 [-0.77042389  1.37186134  1.10656345]
 [-0.64367491 -1.64259684  0.07670152]] 

 [[-0.3131609   2.91000032  0.05345839]   注:改變mean
 [ 1.02557099  1.4983114   1.0096215 ]
 [ 0.04088056 -0.46121705  0.84912884]
 [ 1.6297015   1.78532612  1.63241696]] 

 [[ 1.02556646  1.06140542  0.95061553]   注:改變stddev
 [ 0.95882273  1.06045055  0.93019575]
 [ 1.01397991  1.04606271  0.98129165]
 [ 0.97213674  1.02047527  0.91133404]] 

 [[ 0.8690393   1.02124465  0.98376209]   注:不改變參數
 [ 0.86988747  1.00890124  0.94916052]
 [ 1.08255732  1.18365812  1.02787971]
 [ 0.92205626  1.08017385  1.0712074 ]] 

 [[ 0.91886818  1.14845991  1.00653291]   注:設置seed
 [ 1.00992489  1.06396973  1.16108716]
 [ 1.01635361  0.84842944  1.13587773]
 [ 1.05417418  0.91399014  0.99959755]] 

 [[ 0.91886818  1.14845991  1.00653291]   注:設置name
 [ 1.00992489  1.06396973  1.16108716]
 [ 1.01635361  0.84842944  1.13587773]
 [ 1.05417418  0.91399014  0.99959755]]
分析上面的結果可以看到:

1與2相比改變shape,由[5,3]變爲[4,3]; 2與3相比改變mean,3與4相比改變stddev,該兩者不容易看出變化;4與5相比不改變任何參數,但是輸出的結果卻不相同,說明每次數據時隨機生成;5與6相比改變seed,有變化但看不出規律;6與7相比,設置name,但seed一樣,結果生成隨機數也一樣。



tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)


從正態分佈中輸出隨機值。

參數說明:

  • shape: 一維的張量,也是輸出的張量。
  • mean: 正態分佈的均值。
  • stddev: 正態分佈的標準差。
  • dtype: 輸出的類型。
  • seed: 一個整數,當設置之後,每次生成的隨機數都一樣。
  • name: 操作的名字。

參考程序:

weights1 = tf.random_normal([5,3], mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
weights2 = tf.random_normal([4,3], mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
weights3 = tf.random_normal([4,3], mean=1.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)
weights4 = tf.random_normal([4,3], mean=1.0, stddev=0.1, dtype=tf.float32, seed=None, name=None)
weights5 = tf.random_normal([4,3], mean=1.0, stddev=0.1, dtype=tf.float32, seed=None, name=None)
weights6 = tf.random_normal([4,3], mean=1.0, stddev=0.1, dtype=tf.float32, seed=1, name=None)
weights7 = tf.random_normal([4,3], mean=1.0, stddev=0.1, dtype=tf.float32, seed=1, name='weights')

with tf.Session() as sess:
    wei = sess.run([weights1, weights2, weights3, weights4, weights5, weights6, weights7])
    print(wei[0], '\n\n', wei[1],'\n\n', wei[2], '\n\n', wei[3], '\n\n', wei[4], '\n\n', wei[5], '\n\n', wei[6])

輸出結果:

[[ 0.95111936 -0.57976705  0.54291123]
 [ 1.08912957  1.9003365  -0.51575106]
 [-0.22056603  0.39582339 -1.45163655]
 [-0.21177982 -0.94636458  1.94973588]
 [ 1.41111338  0.08524771 -0.22427951]] 

 [[-0.57301217  0.39068761 -0.0805126 ]   注:改變shape大小(相對於前一個,以下同此)
 [ 0.83093673  0.22929597  0.58930683]
 [-1.072523    0.71288842  0.4403919 ]
 [ 0.10952823  0.80957288 -0.10018495]] 

 [[ 1.23791981  0.23359662  1.06213105]   注:改變mean
 [ 2.20773888  2.51970339  1.2622081 ]
 [ 0.50027692  0.81421649  0.42734003]
 [ 0.44198453  0.75620997  1.00462055]] 

 [[ 0.9260726   0.82585025  1.1689316 ]   注:改變stddev
 [ 1.06053722  1.10892439  0.99613881]
 [ 0.9387871   0.99501306  0.9807108 ]
 [ 1.05458248  1.17204237  1.1695354 ]] 

 [[ 1.06076431  0.96405172  0.89795625]   注:不改變參數
 [ 0.8970378   0.91725588  1.14489996]
 [ 1.09667552  0.9301582   1.02242005]
 [ 1.05819428  1.19008327  0.81654358]] 

 [[ 0.91886818  1.14845991  1.00653291]   注:設置seed
 [ 0.75572956  1.00992489  1.05912244]
 [ 1.0592823   0.78770703  0.92771029]
 [ 0.99437296  1.06435442  0.97356761]] 

 [[ 0.91886818  1.14845991  1.00653291]   注:設置name
 [ 0.75572956  1.00992489  1.05912244]
 [ 1.0592823   0.78770703  0.92771029]
 [ 0.99437296  1.06435442  0.97356761]]
分析上面的結果可以看到:

1與2相比改變shape,由[5,3]變爲[4,3]; 2與3相比改變mean,3與4相比改變stddev,該兩者不容易看出變化;4與5相比不改變任何參數,但是輸出的結果卻不相同,說明每次數據時隨機生成;5與6相比改變seed,有變化但看不出規律;6與7相比,設置name,但seed一樣,結果生成隨機數也一樣。

另外,當設置不同的seed值時,生成的隨機數自然也不同,因此對於以上兩種方式給seed的設置中,在無特殊要求時,如果我們想要每次都生成相同的隨機數,則只需設置seed=True即可。


結論:tf.truncated_normal與tf.random_normal生成的值服都是從具有指定平均值和標準偏差的正態分佈,只不過對tf.truncated_normal而言,如果生成的值大於平均值2個標準偏差的值則丟棄重新選擇



發佈了31 篇原創文章 · 獲贊 111 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章