首先回顾一下batch normalization的原理。BN主要原理是使得每一层的输出的分布相同,从而让网络的每一层不必再因为需要学习数据分布上的不同而受到影响。BN的好处包括允许网络使用较高的学习率,能够起到一定的regularization的作用等等,从而加速训练。
一般来讲BN layer可以放在FC layer或conv layer的后边,数据量大或复杂的情况下可以每层都放。也有说法认为在小数据量或网络简单的情况下,在data layer后边放一个就好了。
然后讲解一下caffe中BN层的参数设置,除了其他层也有的基本参数外,BN中的一个重要参数是use_global_stats,含义是:如果为真,则使用保存的均值和方差,否则采用滑动平均计算新的均值和方差。该参数缺省的时候,如果是测试阶段则等价为真,如果是训练阶段则等价为假。因此实际上可以略去不写,但是在读代码时应注意,设置不对的话训练可能会有问题。
此外还有一种可能用到的BN层设置如下,将学习率设为0:
layer {
name: "dw/bn"
type: "BatchNorm"
bottom: "dw"
top: "dw"
param {
lr_mult: 0
decay_mult: 0
}
param {
lr_mult: 0
decay_mult: 0
}
param {
lr_mult: 0
decay_mult: 0
}
}