转载: 

Batch Normalization层中有个参数use_global_stats,它表示是否使用caffe内部的均值和方差。

训练的时候,要将use_global_stats设置为false

而测试的时候将use_global_stats设置为true。

caffe+报错︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization

https://www.cnblogs.com/damumu/p/7320519.html 

ResNet部署阶模型Proto文件片段

但是如果直接拿这个Proto用于训练(基于随机初始化),则会导致模型不收敛

原因在于在Caffe的batch_norm_layer.cpp实现中,use_global_stats==true时

会强制使用模型中存储的BatchNorm层均值与方差参数,而非基于当前batch内计算均值和方差。

 

首先看use_global_stats变量是如何计算的: 

caffe一些小知识点-bn层的use_global_stats

再看这个变量的作用:

caffe一些小知识点-bn层的use_global_stats

以下代码在use_global_stats为false的时候通过moving average策略计算模型中最终存储的均值和方差:

caffe一些小知识点-bn层的use_global_stats

 

因此,对于随机初始化训练BatchNorm层,只需要在Proto文件中移除use_global_stats参数即可

Caffe会根据当前的Phase(TRAIN或者TEST)

自动去设置use_global_stats的值。 

相关文章: