【问题标题】:Introducing Batch Normalization destroys later training引入 Batch Normalization 会破坏以后的训练
【发布时间】:2017-08-27 13:28:20
【问题描述】:

我试图(未成功)在我的模型中引入批量标准化,显示为here。 (从代码中的def LeNet(x) 块开始。这是没有BN 的模型)。

我尝试通过这样做来介绍 BN:

def conv_layer(x, filters, ksize=3, bn=False, train=False):
    x = tf.layers.conv2d(x, filters, ksize, padding='same',
                            kernel_initializer=tf.contrib.layers.xavier_initializer_conv2d())
    if bn:
        x = tf.layers.batch_normalization(x, training=train)
    x = tf.nn.relu(x)
    x = tf.layers.max_pooling2d(x,2,2)
    return x 

对于优化器来说:

with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):
    optimizer = tf.train.AdamOptimizer(learning_rate = rate)
    training_operation = optimizer.minimize(loss_operation)

问题是,即使我已经注释掉了批量归一化层和 tf.control_dependencies 部分,并重新运行训练,我的准确率下降到大约 2%(并且仍然存在),而在 70% 区域之前。

我在 tf 版本 1.3.0 的 Jupyter Notebook 上运行它。我知道tf.control_dependencies 部分是必需的,因为 BN 会计算批次之间事物的移动平均值。

所以如果我分解问题:

  1. 为什么即使我注释掉了 BN 部分,训练也会受到影响。
  2. tf.control_dependencies 到底在做什么?
  3. 在 tensorflow 中使用 BN 是否需要做任何额外的工作。

参考:

BN 版本为here:

【问题讨论】:

    标签: python tensorflow batch-normalization


    【解决方案1】:

    (1) 表示您的代码中某处存在错误。

    (2) 批量归一化在训练时构建批量统计的移动平均值以在推理时使用。控制依赖关系确保训练移动平均值得到更新

    (3) 没有

    【讨论】:

      猜你喜欢
      • 2018-02-27
      • 2016-11-29
      • 2020-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多