介绍批量标准化会破坏以后的培训

时间:2017-08-27 13:28:21

标签: python tensorflow batch-normalization

我试图(不成功地)在我的模型中引入批量标准化,显示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%的区域。

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

所以如果我分解问题:

  1. 为什么即使在我评论BN部分之后训练也会受到影响。
  2. tf.control_dependencies到底在做什么?
  3. 在张量流中使用BN还有什么需要做的。
  4. 参考:

    BN版本为here

1 个答案:

答案 0 :(得分:0)

(1)表示代码中存在错误。

(2)批量标准化在培训时间建立批次统计的移动平均值以在推理时使用。控制依赖性确保正在更新训练移动平均值

(3)没有