【问题标题】:Why are different bias values used in different types of layers为什么在不同类型的层中使用不同的偏差值
【发布时间】:2018-04-17 19:19:24
【问题描述】:

我知道偏差与1 将被添加到每一层的输入向量或就像它是一个具有1 恒定输出的神经元一样。从偏置神经元出来的权重是在训练期间训练的正常权重。

现在我正在研究 Tensorflow 中的一些神经网络代码。例如。这个(它只是 CNN (VGGnet) 的一部分,特别是 CNN 中卷积结束和全连接层开始的部分):

with tf.name_scope('conv5_3') as scope:
    kernel = tf.Variable(tf.truncated_normal([3, 3, 512, 512], dtype=tf.float32,
                                             stddev=1e-1), name='weights')
    conv = tf.nn.conv2d(self.conv5_2, kernel, [1, 1, 1, 1], padding='SAME')
    biases = tf.Variable(tf.constant(0.0, shape=[512], dtype=tf.float32),
                         trainable=True, name='biases')
    out = tf.nn.bias_add(conv, biases)
    self.conv5_3 = tf.nn.relu(out, name=scope)
    self.parameters += [kernel, biases]

# pool5
self.pool5 = tf.nn.max_pool(self.conv5_3,
                            ksize=[1, 2, 2, 1],
                            strides=[1, 2, 2, 1],
                            padding='SAME',
                            name='pool4')

with tf.name_scope('fc1') as scope:
    shape = int(np.prod(self.pool5.get_shape()[1:]))
    fc1w = tf.Variable(tf.truncated_normal([shape, 4096],
                                           dtype=tf.float32,
                                           stddev=1e-1), name='weights')
    fc1b = tf.Variable(tf.constant(1.0, shape=[4096], dtype=tf.float32),
                       trainable=True, name='biases')
    pool5_flat = tf.reshape(self.pool5, [-1, shape])
    fc1l = tf.nn.bias_add(tf.matmul(pool5_flat, fc1w), fc1b)
    self.fc1 = tf.nn.relu(fc1l)
    self.parameters += [fc1w, fc1b]

现在我的问题是,为什么卷积层中有偏差0 而在全连接层中它是1(该模型中的每个卷积层都有0 用于偏差,而FC 层有1)?还是我的解释仅涵盖全连接层,而与卷积层不同?

【问题讨论】:

    标签: machine-learning tensorflow conv-neural-network


    【解决方案1】:

    偏差(在任何层中)通常用零初始化,但随机或特定的小值也是可能的。引用Stanford CS231n:

    初始化偏差。初始化 偏差为零,因为对称性破坏是由 权重中的小随机数。对于 ReLU 非线性,一些 人们喜欢对所有偏差使用小的常数值,例如 0.01 因为这确保了所有 ReLU 单元在开始时触发并且 因此获得并传播一些梯度。然而,尚不清楚 如果这提供了一致的改进(实际上有些结果似乎 表示这表现更差)并且更常见的是简单地 使用 0 偏差初始化。

    其他例子:tf.layers.dense函数,是创建FC层的快捷方式,默认使用zero_initializer;而这个sample CNN 对所有权重和偏差使用随机初始化,并且不会影响性能。

    因此,总而言之,bias init 并不那么重要(与 weight init 相比),我敢肯定,在使用零或小的随机 init 时,您也会获得相似的训练速度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-13
      • 2016-07-26
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      相关资源
      最近更新 更多