caffe训练网络不收敛——有哪些坑需要我们去填

caffe训练网络不收敛——有哪些坑需要我们去填

在深度学习领域,caffe已经被广泛使用了,但是对于caffe新手来说,在网络训练过程中总会遇到一些摸不着头脑的问题不知道如何解决,本文总了我在使用caffe过程中的一些经验。

  1. 自己定义网络结构——训练
    自己定义网络结构在训练过程中一般需要两个文件:solver.prototxt 和 train-val.prototxt. 其中solver文件中存放的是网络参数更新方法,比如SGD(随机梯度下降),caffe中默认使用SGD对网络参数进行训练,除非特别指明别的参数更新方法。在这个文件中比较重要的参数是学习率(base_lr)的设置。base_lr这个参数在自己训练新网络时,可以从0.1开始尝试,如果模型不收敛(loss不下降的意思),那就降低,除以10,用0.01尝试,一般来说0.01会收敛,不行的话就用0.001. 这个学习率也不是固定不变的,在solver文件中还要设置,这个学习率的更新方法,有的是利用step,迭代多少次后更新,更新参数为gamma。
    train-val文件,存放网络构架。 这个文件有坑,有的网络使用layer{}实现,有的是layers{},这两者构建出俩的网络结果一样,但是内部参数的名称表示会有不同,一定要注意区分。

  2. fine-tune别人的网络构架——训练
    利用别人的网络构架,会省事很多。跟自己训练网络的主要不同在于,train-val文件和训练时脚本不同。前几层的卷积网络用来提取general特征,后面几层fc网络用来提取跟特定task有关的特征,因此在fine-tuning的时候,可以设置前面几层卷积层学习率为0. 直接把别人的网络参数copy过来自己用,只需要利用fc学习自己特殊的特征即可。


讲了这么多,还没有讲到坑在哪里。
其实坑就在数据准备过程中。
很多同学会发现,为什么我训练网络的时候loss一直居高不下,或者呈震荡趋势,不收敛。
居高不下:loss维持在80多,不要以为80多是个小数字,如果你傻傻的一直训练,就会白白浪费GPU的寿命。
这种情况一般是因为数据类别有误,caffe支持类别从0开始划分,比如说3类,那么类别应该是0,1,2.如果你的数据给的是1,2,3那么就会出现这个不收敛情况。
震荡不停: 一会到11,一会又0.1,不要以为它总会收敛,其实它很调皮,这种不收敛的情况可能跟你的train-val文件网络构架有误有关,比如你在fine-tuning的过程中,修改了学习率和参数,但是最后一层的类别忘记了修改,原本是10类,但你的数据只要分为3类即可,就会出现此种不收敛情况。

解决以上各种坑的最简单方法就是:细心

——————————————————————————

EMMA
SIAT
2017.03.21

你可能感兴趣的:(caffe)