tf.truncated_normal和tf.random_normal有什么区别?

时间:2017-01-17 18:32:58

标签: math machine-learning tensorflow

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) { switch (comboBox1.SelectedIndex) { case 1: ScriptName = @"c:\utils\Script2.ps1"; break; case 2: ScriptName = @"c:\utils\Script3.ps1"; break; default: ScriptName = @"c:\utils\Script1.ps1"; break; } } private void bw_DoWork(object sender, EventArgs e) { var loadScript = LoadScript(ScriptName); if (string.IsNullOrWhiteSpace(loadScript)) return; RunScriptResult = RunScript(loadScript); } private static string LoadScript(string filename) { if (!File.Exists(filename)) return ""; var fileContents = new StringBuilder(); var lines = File.ReadAllLines(filename); foreach (var line in lines) { fileContents.Append(line + "\n"); } return fileContents.ToString(); } private static string RunScript(string scriptText) { //should start from this line // create Powershell runspace Runspace runspace = RunspaceFactory.CreateRunspace(); //bla bla bla bla return "something"; } 输出正态分布中的随机值。

tf.random_normal(shape, mean=0.0, stddev=1.0, dtype=tf.float32, seed=None, name=None)输出截断的正态分布中的随机值。

我尝试使用Google搜索'截断正态分布'。但是不太了解。

3 个答案:

答案 0 :(得分:61)

documentation说明了一切: 对于截断的正态分布:

  

生成的值遵循具有指定均值的正态分布   和标准偏差,除了幅度更大的值   比平均值偏离2个标准偏差并重新选择。

很可能通过为自己绘制图表很容易理解差异(%magic是因为我使用的是jupyter笔记本):

import tensorflow as tf
import matplotlib.pyplot as plt

%matplotlib inline  

n = 500000
A = tf.truncated_normal((n,))
B = tf.random_normal((n,))
with tf.Session() as sess:
    a, b = sess.run([A, B])

现在

plt.hist(a, 100, (-4.2, 4.2));
plt.hist(b, 100, (-4.2, 4.2));

enter image description here

使用截断法线的要点是克服sigmoid等大部分函数的饱和度(如果值太大/太小,则神经元停止学习)。

答案 1 :(得分:22)

tf.truncated_normal()从正态分布中选择随机数,其均值接近于0且值接近于0.例如,从-0.1到0.1。它被称为截断,因为你从正常分布中切断了尾巴。

tf.random_normal()从正态分布中选择随机数,其均值接近0,但值可以稍微分开。例如,从-2到2。

在机器学习中,实际上,您通常希望权重接近0。

答案 2 :(得分:7)

API documentation for tf.truncated_normal()将函数描述为:

  

从截断的正态分布输出随机值。

     

生成的值遵循具有指定均值和标准差的正态分布,但值大小为的值除外   与平均值相差超过2个标准偏差   重新拾取。