菜鸟实习日记~day14(BN层)

科研:

BN层

Batch Normalization是由google提出的一种训练优化方法。参考论文:Batch Normalization Accelerating Deep Network Training by Reducing Internal Covariate Shift

个人觉得BN层的作用是加快网络学习速率,论文中提及其它的优点都是这个优点的副产品。

How to use BN?

Normalization是数据标准化(归一化,规范化),Batch 可以理解为批量,加起来就是批量标准化。

先说Batch是怎么确定的。在CNN中,Batch就是训练网络所设定的图片数量batch_size。

Normalization过程,引用论文中的解释:

输入:输入数据x1..xm(这些数据是准备进入激活函数的数据)

计算过程中可以看到,

1.求数据均值;

2.求数据方差;

3.数据进行标准化(个人认为称作正态化也可以)

4.训练参数γ,β

5.输出y通过γ与β的线性变换得到原来的数值

在训练的正向传播中,不会改变当前输出,只记录下γ与β。

在反向传播的时候,根据求得的γ与β通过链式求导方式,求出学习速率以至改变权值

(特征图里的值,作为BN的输入,也就是这9个数值通过BN计算并保存γ与β,通过γ与β使得输出与输入不变)

Why to use BN?

为了防止梯度爆炸或梯度弥散

When to use BN?

OK,说完BN的优势,自然可以知道什么时候用BN比较好。例如,在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度

在finetune Resnet时,网络结构文件中BatchNorm层的参数要注意:

1.在训练时所有BN层要设置use_global_stats: false(也可以不写,caffe默认是false)

2.在测试时所有BN层要设置use_global_stats: true

影响:

1.训练如果不设为false,会导致模型不收敛

2.测试如果不设置为true,会导致准确率极低

(亲测,测试时为false时acc=0.05,为true时acc=0.91)

区别:

use_global_stats: false是使用了每个Batch里的数据的均值和方差;

use_global_stats: true是使用了所有数据的均值和方差

推荐阅读更多精彩内容