哪里可以在标准 CNN 上应用批量归一化

who*_*olt 9 python machine-learning conv-neural-network tensorflow batch-normalization

我有以下架构:

Conv1
Relu1
Pooling1
Conv2
Relu2
Pooling3
FullyConnect1
FullyConnect2
Run Code Online (Sandbox Code Playgroud)

我的问题是,我在哪里应用批量标准化?在 TensorFlow 中执行此操作的最佳功能是什么?

ske*_*r88 14

关于这个问题存在一些争论。这个 Stack Overflow 线程这个 keras 线程就是争论的例子。Andrew Ng 表示,批量归一化应该在当前层的非线性之前立即应用。BN论文的作者也这么说,但是现在根据keras线程上的Fran\xc3\xa7ois Chollet的说法,BN论文作者在激活层之后使用了BN。另一方面,有一些基准测试,例如在 torch-residual-networks github 问题上讨论的基准测试,表明 BN 在激活层之后表现更好。

\n\n

我目前的观点(欢迎更正)是,你应该在激活层之后进行 BN,如果你有预算并且想要挤出额外的准确率,请在激活层之前尝试。

\n\n

因此,向 CNN 添加批量归一化将如下所示:

\n\n
Conv1\nRelu1\nBatchNormalization\nPooling1\nConv2\nRelu2\nBatchNormalization\nPooling3\nFullyConnect1\nBatchNormalization\nFullyConnect2\nBatchNormalization\n
Run Code Online (Sandbox Code Playgroud)\n

  • 这可能不会产生很大的影响,但池化后的标准化可能会更快一些。 (3认同)

Max*_*xim 9

原始批规范论文规定在 ReLU 激活之前使用批规范。但有证据表明,在激活使用 batchnorm 可能更好。这是Francois Chollet对Keras GitHub的评论:

...我可以保证最近由 Christian [Szegedy] 编写的代码在 BN 之前应用了 relu。不过,它仍然偶尔会成为争论的话题。

对于您的第二个问题:在 tensorflow 中,您可以使用高级tf.layers.batch_normalization函数或低级tf.nn.batch_normalization.