caffe中应该如何使用“BatchNorm”层?

Posted

技术标签:

【中文标题】caffe中应该如何使用“BatchNorm”层?【英文标题】:How should "BatchNorm" layer be used in caffe? 【发布时间】:2017-05-27 06:27:22 【问题描述】:

我对如何在我的模型中使用/插入"BatchNorm" 层有点困惑。 我看到了几种不同的方法,例如:

ResNets:"BatchNorm"+"Scale"(无参数共享)

"BatchNorm" 层紧跟"Scale" 层:

layer 
    bottom: "res2a_branch1"
    top: "res2a_branch1"
    name: "bn2a_branch1"
    type: "BatchNorm"
    batch_norm_param 
        use_global_stats: true
    


layer 
    bottom: "res2a_branch1"
    top: "res2a_branch1"
    name: "scale2a_branch1"
    type: "Scale"
    scale_param 
        bias_term: true
    

cifar10 example:只有"BatchNorm"

在 caffe 提供的 cifar10 示例中,"BatchNorm" 使用后没有任何 "Scale"

layer 
  name: "bn1"
  type: "BatchNorm"
  bottom: "pool1"
  top: "bn1"
  param 
    lr_mult: 0
  
  param 
    lr_mult: 0
  
  param 
    lr_mult: 0
  

cifar10 batch_norm_paramTRAINTEST 不同

batch_norm_param: use_global_scaleTRAINTEST 之间变化:

layer 
  name: "bn1"
  type: "BatchNorm"
  bottom: "pool1"
  top: "bn1"
  batch_norm_param 
    use_global_stats: false
  
  param 
    lr_mult: 0
  
  param 
    lr_mult: 0
  
  param 
    lr_mult: 0
  
  include 
    phase: TRAIN
  

layer 
  name: "bn1"
  type: "BatchNorm"
  bottom: "pool1"
  top: "bn1"
  batch_norm_param 
    use_global_stats: true
  
  param 
    lr_mult: 0
  
  param 
    lr_mult: 0
  
  param 
    lr_mult: 0
  
  include 
    phase: TEST
  

那应该是什么?

在 caffe 中应该如何使用"BatchNorm" 层?

【问题讨论】:

感谢您的信息。我查看了一些当前的 prototxt。他们在 BN 中不使用decay_mult,只使用lr_mult:0。我说的对吗? @user3051460 decay_multlr_mult 对于"BatchNorm" 层没有意义,因为它的参数是根据输入统计信息而不是反向传播梯度更新的。 AFAIK,最新版本的 caffe 自动将此层的 lr_mult 设置为零。 你的意思是默认值可以在github.com/BVLC/caffe/blob/…查看?因为我想检查我当前的 caffe 是否设置为零 【参考方案1】:

在每个 BatchNorm 之后,我们必须在 Caffe 中添加一个 Scale 层。原因是 Caffe BatchNorm 层仅从输入数据中减去均值并除以它们的方差,而不包括分别缩放和移动归一化分布 1 的 γ 和 β 参数。相反,Keras BatchNormalization 层包括并应用上面提到的所有参数。在 Caffe 中使用参数“bias_term”设置为 True 的 Scale 层,提供了一个安全的技巧来重现 Keras 版本的确切行为。 https://www.deepvisionconsulting.com/from-keras-to-caffe/

【讨论】:

【参考方案2】:

如果您遵循原始论文,批量归一化之后应该是 Scale 和 Bias 层(可以通过 Scale 包含偏差,尽管这会使 Bias 参数无法访问)。 use_global_stats 也应该从训练 (False) 更改为测试/部署 (True) - 这是默认行为。请注意,您给出的第一个示例是用于部署的 prototxt,因此将其设置为 True 是正确的。

我不确定共享参数。

我提出了一个拉取请求来改进批量规范化的文档,但后来因为我想修改它而关闭了它。然后,我再也没有回过头来。

请注意,我认为 "BatchNorm"lr_mult: 0 不再需要(也许不允许?),尽管我现在没有找到相应的 PR。

【讨论】:

(1) 哦,为什么你不回去记录"BatchNorm"?? (2) PR #4704 旨在简化 "BatchNorm" 定义中的 lr_mult 参数。恕我直言,这只创建了一个mess。 感谢鼓励回到它:-)。从表面上看,我喜欢不指定 lr_mult(我觉得这很混乱),但正如你所指出的,它确实会造成混乱。 刚刚找到您的 caffe.help 网页 - 太棒了!谢谢!

以上是关于caffe中应该如何使用“BatchNorm”层?的主要内容,如果未能解决你的问题,请参考以下文章

caffe中关于(ReLU层,Dropout层,BatchNorm层,Scale层)输入输出层一致的问题

何时在 Caffe 中使用就地层?

caffe中batch norm源码阅读

如何使用 caffe batch norm

如何在 PyTorch 中进行完全连接的批处理规范?

如何向caffe中添加层