caffe常用層: batchNorm層和scale層


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM