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層有兩個參數,參數可調。