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即可。