欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在caffe中,BN层怎么用?

程序员文章站 2022-04-30 16:37:47
...

目录

1.BN的作用

2.BN在caffe中代码

3.补充

4.参考


1.BN的作用

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。

2.BN在caffe中代码

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

layer {
	name: "conv1"
	type: "Convolution"
	bottom: "data"
    top: "conv1"
	param{
		lr_mult:1
		decay_mult:1
	}
	param{
	    lr_mult:2
		decay_mult:0
	}
    convolution_param{
		num_output:32
		kernel_size:5
		weight_filler{
			type:"xavier"
		}
		bias_filler{
			type:"constant"
		}
	}
}
layer {  
  name: "BatchNorm1"  
  type: "BatchNorm" 
  bottom: "conv1"  
  top: "conv1"   
  param {  
    lr_mult: 0  
    decay_mult: 0  
  }   
  param {  
    lr_mult: 0  
    decay_mult: 0  
  }  
  param {  
    lr_mult: 0  
    decay_mult: 0  
  }
}  
 
layer {  
  name: "scale1"  
  type: "Scale"
  bottom: "conv1"  
  top: "conv1"    
  scale_param {  
    bias_term: true  
  }  
} 
layer{
	name:"relu1"
	type:"ReLU"
	bottom:"conv1"
	top:"conv1"
}

第二种情况:加上use_global_stats, 测试的时候再改成true

layer {  
  name: "BatchNorm1"  
  type: "BatchNorm" 
  bottom: "conv1"  
  top: "conv1"   
  param {  
    lr_mult: 0  
    decay_mult: 0  
  }   
  param {  
    lr_mult: 0  
    decay_mult: 0  
  }  
  param {  
    lr_mult: 0  
    decay_mult: 0  
  }
  batch_norm_param {
		use_global_stats: false
	}
}

3.补充

在下面参考【3】中,主要说了一下几点:

(1)加快训练速度的方法由两种:白化和去均值

在caffe中,BN层怎么用?

假设其分布如上图a所示(简化为2维)。由于初始化的时候,我们的参数一般都是0均值的(初始化值为全0),因此开始的拟合y=Wx+b,基本过原点附近,如图b红色虚线。因此,网络需要经过多次学习才能逐步达到如紫色实线的拟合,即收敛的比较慢。如果我们对输入数据先作减均值操作,如图c,显然可以加快学习。更进一步的,我们对数据再进行去相关操作,使得数据更加容易区分,这样又会加快训练,如图d。 
 

(2)BN可以让数据具有0均值和单位方差,加快收敛速度,对比图如下:

在caffe中,BN层怎么用?

(3)在使用BN的过程中,作者发现Sigmoid**函数比Relu效果要好。

这一点作者并没有在文章中作出理论说明,我觉得应该是实验确定的。


4.参考

【1】caffe 中 BatchNorm layer设定

【2】BatchNorm layer设定

【3】解读Batch Normalization