转载:
Batch Normalization层中有个参数use_global_stats,它表示是否使用caffe内部的均值和方差。
训练的时候,要将use_global_stats设置为false
而测试的时候将use_global_stats设置为true。
caffe+报错︱深度学习参数调优杂记+caffe训练时的问题+dropout/batch Normalization
ResNet部署阶模型Proto文件片段
但是如果直接拿这个Proto用于训练(基于随机初始化),则会导致模型不收敛
原因在于在Caffe的batch_norm_layer.cpp实现中,use_global_stats==true时
会强制使用模型中存储的BatchNorm层均值与方差参数,而非基于当前batch内计算均值和方差。
首先看use_global_stats变量是如何计算的:
再看这个变量的作用:
以下代码在use_global_stats为false的时候通过moving average策略计算模型中最终存储的均值和方差:
因此,对于随机初始化训练BatchNorm层,只需要在Proto文件中移除use_global_stats参数即可