caffe的BN层共有三个参数:均值、方差和滑动系数。
layer { bottom: "res2a_branch2b" top: "res2a_branch2b" name: "bn2a_branch2b" type: "BatchNorm" batch_norm_param { use_global_stats: false //训练阶段和测试阶段不同, } include: { phase: TRAIN } } layer { bottom: "res2a_branch2b" top: "res2a_branch2b" name: "bn2a_branch2b" type: "BatchNorm" batch_norm_param { use_global_stats: true } include: { phase: TEST } }
use_global_stats:如果为真,则使用保存的均值和方差,否则采用滑动平均计算新的均值和方差。该参数缺省时,如果是测试阶段等价为真,如果是训练阶段等价为假。
moving_average_fraction: 滑动平均的衰减系数,默认为0.999.
eps:分母附加值,防止除以方差出现0的操作,默认为1e-5(不同框架采用的默认值不一样)。
通常,BN层的设置如下:
layer { name: "conv02/main/bn" type: "BatchNorm" bottom: "conv02/main" top: "conv02/main" param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } param { lr_mult: 0 decay_mult: 0 } }
在caffe中使用BN需要注意以下两点:
1、要配合Scale层一起使用。
2、训练的时候,将BN层的use_global_stats设置为false,然后测试的时候将use_global_stats设置为true,不然训练的时候会报“NAN”或者模型不收敛。
可选参数定义在src/caffe/proto/caffe.proto中,共有3个:
message BatchNormParameter { optional bool use_global_stats = 1; optional float moving_average_fraction = 2 [default = .999]; optional float eps = 3 [default = 1e-5]; }
BN的计算:
注意:由于BN的三个参数都是来自于样本的计算,不需要学习,所以参数都设为0
caffe中为什么bn层要和scale层一起使用
这个问题首先要清楚BN的是做什么的。它其实做了两件事:
(1)输入归一化x_norm = (x-u)/std,其中u和std是个累计计算的均值和方差。
(2)y = alpha*x_norm+beta,对归一化后的x进行比例缩放和位移。其中的alpha和beta是通过迭代学习得到的。
那么caffe中的BN层其实只做了第一件事,scale层做了第二件事。
所以scale层有两个参数,参数可调。
转载:https://blog.csdn.net/wfei101/article/details/78887514
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:caffe常用层: batchNorm层和scale层 - Python技术站