我对如何在模型中使用/插入"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示例: 仅"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 对TRAIN
和TEST
使用不同的batch_norm_param
batch_norm_param: use_global_scale
在TRAIN
和TEST
阶段之间发生变化:
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"
层?
回答:
如果按照原始论文的做法,批量归一化应该接着Scale和Bias层(虽然可以通过Scale包含Bias,但这会使Bias参数无法访问)。use_global_stats
也应该在训练(False)与测试/部署(True)之间进行切换——这是默认行为。请注意,您提供的第一个示例是用于部署的prototxt,因此将其设置为True是正确的。
关于共享参数,我不太确定。
我曾提交了一个拉取请求以改进批量归一化的文档,但后来关闭了它,因为我想对其进行修改。然而,我之后再也没有回到这个请求上。
请注意,我认为"BatchNorm"
的lr_mult: 0
现在可能不再需要(或许是不允许的?),虽然我现在找不到相应的PR。