zoukankan      html  css  js  c++  java
  • caffe常用层: batchNorm层和scale层

    caffe的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(不同框架采用的默认值不一样)。

    通常,BN层的设置如下:

    layer {
      name: "conv02/main/bn"
      type: "BatchNorm"
      bottom: "conv02/main"
      top: "conv02/main"
      param {
        lr_mult: 0
        decay_mult: 0
      }
      param {
        lr_mult: 0
        decay_mult: 0
      }
      param {
        lr_mult: 0
        decay_mult: 0
      }
    }

    在caffe中使用BN需要注意以下两点:

    1、要配合Scale层一起使用。

    2、训练的时候,将BN层的use_global_stats设置为false,然后测试的时候将use_global_stats设置为true,不然训练的时候会报“NAN”或者模型不收敛。

    可选参数定义在src/caffe/proto/caffe.proto中,共有3个:

    message BatchNormParameter {
    
      optional bool use_global_stats = 1;
    
      optional float moving_average_fraction = 2 [default = .999];
     
      optional float eps = 3 [default = 1e-5];
    }

    BN的计算:

     注意:由于BN的三个参数都是来自于样本的计算,不需要学习,所以参数都设为0

     

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

    这个问题首先要清楚BN的是做什么的。它其实做了两件事:

    (1)输入归一化x_norm = (x-u)/std,其中u和std是个累计计算的均值和方差。

    (2)y = alpha*x_norm+beta,对归一化后的x进行比例缩放和位移。其中的alpha和beta是通过迭代学习得到的。

    那么caffe中的BN层其实只做了第一件事,scale层做了第二件事。

    所以scale层有两个参数,参数可调。 

    转载:https://blog.csdn.net/wfei101/article/details/78887514

  • 相关阅读:
    在桌面创建robotframework Ride的快捷方式启动RIDE
    RIDE 接口自动化请求体参数中文时报错:“UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 9......”
    下拉框选择
    Python下安装MySQLdb模块
    出现 Request Entity Too Large问题的解决方法
    Centos配置nginx反向代理8090端口到80端口
    超简单Centos+Docker+Halo搭建java向博客
    JAVA使用POI如何导出百万级别数据
    Mybatis的MapperRegistry错误
    Navicat连接mysql8出现1251错误
  • 原文地址:https://www.cnblogs.com/zhibei/p/12988187.html
Copyright © 2011-2022 走看看