最近尝试用ResNet-50和ShuffleNet做人脸识别,实验还没跑完,但发现batch normalization有些需要注意。
网上搞来的ResNet-50或ShuffleNet的prototxt里面往往会这么搞:
conv(no bias)-bn-scale
其中conv是没有bias的,bn用caffe里原来的自己写的基于cublas运算的版本,不带bias和scale,所以为了按照bn论文里原作者的建议,在bn后面又加了一个带bias的scale layer。
我自己基于cudnn写了一个bn layer,基于cudnn提供的接口,自带scale和bias,不过如果把scale和bias的learning rate和decay rate都设置为0,那也相当于没有scale和bias。
而以前我一直是这么用的:
conv(with bias)-bn
其中conv带bias,bn不带scale和bias。
经过很多实验发现,至少对于我在做的人脸识别问题,conv(no bias)-bn-scale要比conv(with bias)-bn更差。即使学习率已经降到比较小了,前一个模型在验证集(我直接用lfw作为验证集)上的准确率仍然会在较大的幅度内震荡,而后一个模型则可以完全收敛到极小的震荡。
原因也很好解释,因为bn之后又加了scale,会导致梯度反向传播过程中发生梯度膨胀,使模型不稳定。然而,在网上能找到的使用了bn的大部分prototxt里面,似乎前者仍然是主流。
最后,我只是在人脸识别这一个问题上得到了这样的结论,在其他问题上是什么样,还有待于更多实验验证。
再说说caffe里的batch normalization layer
最新推荐文章于 2024-09-02 15:20:19 发布