qed*_*qed 2 python neural-network deep-learning tensorflow
来自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)
Run Code Online (Sandbox Code Playgroud)
似乎所有的偏见都是零.添加它们有什么意义?
您正在查看网络初始化代码.这是训练前的网络.随机weights值不会映射到该阶段的任何有用函数.相反,它们是随机的,以防止每个人工神经元学习相同的东西,因为反向传播是确定性的,你通常需要一些能够打破同一层内神经元之间对称性的东西.否则,每个训练示例将为每个权重生成完全相同的渐变,并且一切都会以锁步方式改变.
这里:
biases = tf.Variable(tf.zeros([hidden1_units]),
name='biases')
Run Code Online (Sandbox Code Playgroud)
biases是一个变量.在训练期间,它会稍后改变.如果您愿意,可以从随机值开始(类似于权重),并且训练仍然可以与示例几乎完全相同.但是,随机权重在实践中已足以防止输出相互复制,因此将偏差设置为零是最简单的方法.
在一些培训之后看一下偏差值,你会发现它们都是不同的.