BN层的设定一般是按照conv->bn->scale->relu的顺序来形成一个block。
关于BN层,有一个注意点,caffe实现中的use_ global_stats参数在训练时设置为false,这样BN层才能更新计算均值和方差,如果设置为true的话,就是初始固定的了,不会更新;测试时设置为true。
因为在训练时bn作用的对象是一个batch_size,而不是整个训练集,如果没有将其设置为false,则有可能造成bn后数据更加偏离中心点,导致nan或87.3365的问题。所以你可以尝试一下修改这个参数。
那么BN层真正的作用是什么呢?
根据论文的理论和可视化分析,BN层的真是作用是使得神经网络的损失函数空间更加平滑,梯度下降不容易陷入局部极值,不那么依赖权重初始化;也使得参数更新时梯度的取值范围更小,梯度更新更具可预测性,不容易出现梯度爆炸和梯度消失。这使得网络可以随机初始化,并使用更大的学习率。
---------------------
作者:qq184861643 (BN层总结与实际作用)
来源:优快云
原文:https://blog.youkuaiyun.com/qq184861643/article/details/83539190
版权声明:本文为博主原创文章,转载请附上博文链接!
Caffe 的 BN(BatchNorm ) 层共有三个参数参数:均值、方差和滑动系数,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(不同框架采用的默认值不一样)
- 参考https://blog.youkuaiyun.com/d5224/article/details/72730220