caffe-关于损失的问题

1)今天用webface库去训练caffe/model下的alexnet网络。

    webface库总共49w张图像,经过MTCNN的检测后,去除大概2800张之后,使用46w左右做训练,3w左右做验证。

   出现很多情况:

     a) loss=87.3365

         据说是因为lr的问题,把lr改小,网络跑起来。       caffe-关于损失的问题

     b)loss的下降速度非常慢

      个人觉得几个可能的原因:

         batchsize太小(Quadro K4000,显存3G,batchsize=32 T.....T 还爆卡):   webface 的库比较复杂,在bsize为32,损失的下降情况比较反复

         alexnet 的权重初始化方式(?不晓得会不会影响) : 由原来的gaussian 改成xavier方式

        batchnormlization : alexnet在前面两个卷积层加入LRN,现在像ResNet采用的是BN层+scale层,似乎收敛速度会快许多。

        alexnet原始做1000的分类,我用在webface改成了10575(贼大,增加了很多参数需要更新,造成收敛速度慢?)

 

c)在lfw上训练alexnet,仔细看,训练集的损失已经下降到比较满意的值,但是(!!!!)验证集上的损失几乎没有下降,或者是说相比与训练集的损失值不在一个数量级上!!!

  caffe-关于损失的问题


    最本质的原因:  网络模型在小数据库上出现过拟合。

        经过一番折腾,还天真以为只要将一堆数据扔进一个网络模型,就高枕无忧了。(too young too simple)。看下官方给的AlexNet 的网络图。

   caffe-关于损失的问题

    AlexNet的3个全连接层参数数量就达到千万级别了。

conv 层的参数数量:feature map * kernel_size *kernel_size  (比如conv1:96*11*11)

fc1层的参数数量:conv_feature_map*output_size*output_size*neural(比如fc6:256*13*13*4096)


    AlexNet模型是在ImageNet那种百万数量级别的数据上进行训练的,现在我直接用一个LFW(13233张)的小图像库,去训练,得到这样的结果,很大的原因就是模型在训练数据上过拟合了,因此在验证集上的精度很低。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

  


  在网上找到一种比较靠谱的解决办法,但原理还不太明白,可以参考下面的讲解:

    (!!)主要解决办法就是: 在使用BN层+层的时候,训练的时候,将BN层的use_global_stats设置为false,测试(验证)的时候将use_global_stats设置为true.

       具体可以使用两个网络文件参数,train.prototxt和val.prototxt;在solver文件中指定train_net:"train.prototxt" 和test_net:"val.prototxt"

       对于Iter=0时,验证集的loss可能是87.3366之类的比较大的值,可以在后面的迭代中观察到,验证集的loss这种情况下下降速度和训练集的loss下降情况差不多。   

=》

可以参考这个博客的解释:http://blog.csdn.net/yelena_11/article/details/53924225

补充说明:

在Caffe中使用Batch Normalization需要注意以下两点,

1. 要配合Scale层一起使用,具体参见http://blog.csdn.net/sunbaigui/article/details/50807398以及Residual Network

2. 训练的时候,将BN层的use_global_stats设置为false,然后测试的时候将use_global_stats设置为true,不然训练的时候会报“NAN”或者模型不收敛 —— 这个其实挺难注意到的

caffe官方将BN层拆成两个层来实验,一个是https://github.com/BVLC/caffe/blob/master/include/caffe/layers/batch_norm_layer.hpp

另外一个是https://github.com/BVLC/caffe/blob/master/include/caffe/layers/scale_layer.hpp

其具体使用方法可以参考:https://github.com/KaimingHe/deep-residual-networks/blob/master/prototxt/ResNet-50-deploy.prototxt

中的BatchNormScale