MNIST 教程中的代码:
with tf.name_scope('hidden1'):
weights = tf.Variable(
tf.truncated_normal([IMAGE_PIXELS, hidden1_units],
stddev=1.0 / math.sqrt(float(IMAGE_PIXELS))),
name='weights')
biases = tf.Variable(tf.zeros([hidden1_units]),
name='biases')
hidden1 = tf.nn.relu(tf.matmul(images, weights) + biases)
# Hidden 2
with tf.name_scope('hidden2'):
weights = tf.Variable(
tf.truncated_normal([hidden1_units, hidden2_units],
stddev=1.0 / math.sqrt(float(hidden1_units))),
name='weights')
biases = tf.Variable(tf.zeros([hidden2_units]),
name='biases')
hidden2 = tf.nn.relu(tf.matmul(hidden1, weights) + biases)
似乎所有的偏见都是零。添加它们有什么意义?
您正在查看网络初始化代码。这是训练前的网络。weights
在那个阶段,随机值不会映射到任何有用的函数。相反,它们是随机的,以防止每个人工神经元学习相同的东西,因为反向传播是确定性的,你通常需要一些东西来破坏同一层内神经元之间的对称性。否则,每个训练示例将为每个权重生成完全相同的梯度,并且一切都会同步变化。
这里:
biases = tf.Variable(tf.zeros([hidden1_units]),
name='biases')
biases
是一个变量。稍后会在训练期间发生变化。如果您愿意,您可以从随机值开始(类似于权重),并且训练仍然与示例几乎相同。然而,随机权重在实践中已经足以防止输出相互复制,因此将偏差设置为零是最简单的方法。
看看一些训练后的偏差值,你会发现它们都是不同的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句