caffe 中 BatchNorm layer设定

转载于http://blog.youkuaiyun.com/u012939857/article/details/70740283

BN层的设定一般是按照conv->bn->scale->relu的顺序来形成一个block。 
关于bn,有一个注意点,caffe实现中的use_global_stats参数在训练时设置为false,测试时设置为true。 
因为在训练时bn作用的对象是一个batch_size,而不是整个训练集,如果没有将其设置为false,则有可能造成bn后数据更加偏离中心点,导致nan或87.3365的问题。

caffe 中为什么bn层要和scale层一起使用

这个问题首先要理解batchnormal是做什么的。它其实做了两件事。 
1) 输入归一化 x_norm = (x-u)/std, 其中u和std是个累计计算的均值和方差。 
2)y=alpha×x_norm + beta,对归一化后的x进行比例缩放和位移。其中alpha和beta是通过迭代学习的。 
那么caffe中的bn层其实只做了第一件事。scale层做了第二件事。 
这样也就理解了scale层里为什么要设置bias_term=True,这个偏置就对应2)件事里的beta。

代码:

第一种情况,phase: TRAIN/TEST都不加 ,caffe会自动匹配去设置use_global_stats的值


 
  1. layer {
  2. name: "conv1"
  3. type: "Convolution"
  4. bottom: "data"
  5. top: "conv1"
  6. param{
  7. lr_mult: 1
  8. decay_mult: 1
  9. }
  10. param{
  11. lr_mult: 2
  12. decay_mult: 0
  13. }
  14. convolution_param{
  15. num_output: 32
  16. kernel_size: 5
  17. weight_filler{
  18. type: "xavier"
  19. }
  20. bias_filler{
  21. type: "constant"
  22. }
  23. }
  24. }
  25. layer {
  26. name: "BatchNorm1"
  27. type: "BatchNorm"
  28. bottom: "conv1"
  29. top: "conv1"
  30. param {
  31. lr_mult: 0
  32. decay_mult: 0
  33. }
  34. param {
  35. lr_mult: 0
  36. decay_mult: 0
  37. }
  38. param {
  39. lr_mult: 0
  40. decay_mult: 0
  41. }
  42. }
  43. layer {
  44. name: "scale1"
  45. type: "Scale"
  46. bottom: "conv1"
  47. top: "conv1"
  48. scale_param {
  49. bias_term: true
  50. }
  51. }
  52. layer{
  53. name: "relu1"
  54. type: "ReLU"
  55. bottom: "conv1"
  56. top: "conv1"
  57. }
第二种情况:加上 use_global_stats, 测试的时候再改成true


 
  1. layer {
  2. name: "BatchNorm1"
  3. type: "BatchNorm"
  4. bottom: "conv1"
  5. top: "conv1"
  6. param {
  7. lr_mult: 0
  8. decay_mult: 0
  9. }
  10. param {
  11. lr_mult: 0
  12. decay_mult: 0
  13. }
  14. param {
  15. lr_mult: 0
  16. decay_mult: 0
  17. }
  18. batch_norm_param {
  19. use_global_stats: false
  20. }
  21. }






Caffe框架中,`BatchNorm`层和`Scale`层通常一起用于实现批量归一化(Batch Normalization),但它们各自承担不同的功能。 ### BatchNorm层的作用 `BatchNorm`层的主要功能是对输入数据进行标准化处理,即将输入的每个通道的特征图(feature map)按照当前批次的数据进行归一化,使其均值接近0,方差接近1。这一过程可以加速网络的训练过程,并有助于缓解内部协变量偏移(Internal Covariate Shift)问题。具体来说,`BatchNorm`层在训练阶段会根据当前批次的均值和方差进行标准化,并通过滑动平均的方式更新全局统计信息;而在测试阶段,则直接使用训练过程中保存的全局均值和方差进行标准化[^2]。 在配置`BatchNorm`层时,需要注意参数`use_global_stats`的设置:训练时通常设为`false`,表示使用当前批次的统计信息进行计算;测试时设为`true`,表示使用训练阶段保存的全局统计信息[^4]。 ### Scale层的作用 `Scale`层的功能是对`BatchNorm`层输出的结果进行可学习的缩放和平移操作。虽然`BatchNorm`层将输入数据标准化为均值为0、方差为1的分布,但这种标准化可能会限制网络的表达能力,因为某些非线性激活函数(如Sigmoid)在输入分布接近0时可能表现不佳。因此,`Scale`层引入了两个可学习参数:缩放因子(scale)和平移因子(shift),使得网络可以根据需要重新调整特征分布[^1]。 在实际使用中,`Scale`层通常紧随`BatchNorm`层之后,并且需要将`Scale`层的`bias_term`参数设置为`true`,以启用平移操作[^3]。 ### BatchNorm层与Scale层的区别 尽管`BatchNorm`层和`Scale`层通常一起使用,但它们的功能有明显区别: - **功能不同**:`BatchNorm`层负责对输入数据进行标准化,而`Scale`层则负责对标准化后的数据进行缩放和平移。 - **参数类型不同**:`BatchNorm`层的参数(均值、方差)通常是通过滑动平均计算得到的统计参数,而`Scale`层的参数(缩放因子和平移因子)是通过梯度下降等优化算法学习得到的可学习参数。 - **使用场景不同**:`BatchNorm`层主要用于加速训练并提高模型稳定性,而`Scale`层则用于恢复因标准化而可能丢失的表达能力[^3]。 综上所述,`BatchNorm`层和`Scale`层在批量归一化中扮演着互补的角色,前者负责标准化输入数据,后者负责恢复网络的表达能力。 ```protobuf # 示例:BatchNorm层和Scale层的配置 layer { name: "batchnorm" type: "BatchNorm" bottom: "conv1" top: "conv1" batch_norm_param { use_global_stats: false moving_average_fraction: 0.999 eps: 1e-5 } } layer { name: "scale" type: "Scale" bottom: "conv1" top: "conv1" scale_param { bias_term: true } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值