"BatchNorm"层在caffe中应该如何使用?
How should "BatchNorm" layer be used in caffe?
我对如何在我的模型中 use/insert 层感到有点困惑。
我看到了几种不同的方法,例如:
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 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"
层应该如何使用?
如果您遵循原始论文,Batch normalization 之后应该是 Scale 和 Bias 层(偏差可以通过 Scale 包含,尽管这使得偏差参数不可访问)。 use_global_stats
也应从训练 (False) 更改为 testing/deployment (True) - 这是默认行为。请注意,您给出的第一个示例是用于部署的prototxt,因此将其设置为True 是正确的。
我不确定共享参数。
我提出了一个 pull request 来改进关于批量规范化的文档,但后来因为我想修改它而关闭了它。然后,我再也没有回过头来。
请注意,我认为 lr_mult: 0
for "BatchNorm"
不再需要(也许不允许?),尽管我现在没有找到相应的 PR。
在每个BatchNorm之后,我们必须在Caffe中添加一个Scale层。原因是 Caffe BatchNorm 层仅从输入数据中减去均值并除以它们的方差,而不包括分别缩放和移动归一化分布 1 的 γ 和 β 参数。相反,Keras BatchNormalization 层包括并应用上面提到的所有参数。在 Caffe 中使用参数“bias_term”设置为 True 的缩放层,提供了一个安全的技巧来重现 Keras 版本的确切行为。
https://www.deepvisionconsulting.com/from-keras-to-caffe/
我对如何在我的模型中 use/insert
我看到了几种不同的方法,例如:
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 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"
层应该如何使用?
如果您遵循原始论文,Batch normalization 之后应该是 Scale 和 Bias 层(偏差可以通过 Scale 包含,尽管这使得偏差参数不可访问)。 use_global_stats
也应从训练 (False) 更改为 testing/deployment (True) - 这是默认行为。请注意,您给出的第一个示例是用于部署的prototxt,因此将其设置为True 是正确的。
我不确定共享参数。
我提出了一个 pull request 来改进关于批量规范化的文档,但后来因为我想修改它而关闭了它。然后,我再也没有回过头来。
请注意,我认为 lr_mult: 0
for "BatchNorm"
不再需要(也许不允许?),尽管我现在没有找到相应的 PR。
在每个BatchNorm之后,我们必须在Caffe中添加一个Scale层。原因是 Caffe BatchNorm 层仅从输入数据中减去均值并除以它们的方差,而不包括分别缩放和移动归一化分布 1 的 γ 和 β 参数。相反,Keras BatchNormalization 层包括并应用上面提到的所有参数。在 Caffe 中使用参数“bias_term”设置为 True 的缩放层,提供了一个安全的技巧来重现 Keras 版本的确切行为。 https://www.deepvisionconsulting.com/from-keras-to-caffe/