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的计算:

caffe常用层: batchNorm层和scale层

 注意:由于BN的三个参数都是来自于样本的计算,不需要学习,所以参数都设为0

 caffe常用层: batchNorm层和scale层

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