因此,我是使用 Tensorflow 的新手,我正在尝试创建一个中性网络,在所有指南中,我看到使用了以下代码行之一。
Weight1 = tf.Variable(tf.truncated_normal([-,-]))
或者...
Weight1 = tf.Variable(tf.random_uniform([-,-]))
它们都在示例中工作,但我想知道它们之间有什么区别,并且在某些情况下比另一种更好?
因此,我是使用 Tensorflow 的新手,我正在尝试创建一个中性网络,在所有指南中,我看到使用了以下代码行之一。
Weight1 = tf.Variable(tf.truncated_normal([-,-]))
或者...
Weight1 = tf.Variable(tf.random_uniform([-,-]))
它们都在示例中工作,但我想知道它们之间有什么区别,并且在某些情况下比另一种更好?
一个简单的谷歌搜索会告诉你差异。
截断正态从截断正态分布中输出随机值。生成的值遵循具有指定均值和标准差的正态分布,但幅度大于均值 2 个标准差的值将被丢弃并重新选择。
Random Uniform从均匀分布中输出随机值。生成的值遵循 [minval, maxval) 范围内的均匀分布。下限 minval 包含在范围内,而上限 maxval 不包括在内。
关于何时使用其中一种更好,我们不知道。权重只需要是随机的,没有结论性的研究表明一种或另一种分布更适合特定场景。话虽如此,有更好的方法可以完全随机地初始化权重。其中包括非常流行的Xavier初始化程序。
tf.truncated_normal
和之间的基本区别tf.random_normal
是前者生成截断值遵循具有指定均值和标准差的正态分布,而后者输出正态分布的随机值。
为什么要使用截断值?
截断的正态分布用于防止产生死神经元。
通常应该使用少量噪声初始化权重,以破坏对称性,并防止梯度为 0。由于我们使用的是ReLU神经元,因此最好使用稍微正的初始偏差来初始化它们以避免死神经元。
在这里,它得到了很好的回答。