您的位置:首页 > Web前端

caffe训练CNN时,loss不收敛原因分析

2017-11-29 11:46 2891 查看
深度学习交流QQ群:116270156

1. 数据和标签

数据分类标注是否准确?数据是否干净?

另外博主经历过自己创建数据的时候数据标签设置为1,2,...,N,训练的时候最后FC层设置的输出output num为N。训练的时候loss一直不降。后来将标签改为0,1,2,...,N-1,重新训练,很快就收敛了。


为啥label需要从0开始?

在使用SoftmaxLoss层作为损失函数层的单标签分类问题中,label要求从0开始,例如1000类的ImageNet分类任务,label的范围是0~999。这个限制来自于Caffe的一个实现机制,label会直接作为数组的下标使用,具体代码SoftmaxLoss.cpp中133行和139行的实现代码。



132行第一层for循环中的outer_num等于batch size,对于人脸识别和图像分类等单标签分类任务而言,inner_num等于1。如果label从1开始,会导致bottom_diff数组访问越界。 


在标签正确的前提下,如果倒数第一个全连接层num_output > 实际的类别数,Caffe的训练是否会报错?答案:不会报错且无影响。 

2. 学习率设定

base_lr这个参数在自己训练新网络时,可以从0.1开始尝试,如果loss不下降的意思,那就降低,除以10,用0.01尝试,一般来说0.01会收敛,不行的话就用0.001. 另外整个训练过程中学习率是可变的,可以在solver文件中指定学习率的变化规则。如:

# The base learning rate, momentum and the weight decay of the network.

base_lr: 0.01

momentum: 0.9

weight_decay: 0.0005

# The learning rate policy

lr_policy: "inv"

gamma: 0.0001

power: 0.75

引用一张图来说明学习率设定对训练的影响:



3. 网络设定不合理

如果做很复杂的分类任务,却只用了很浅的网络,可能会导致训练难以收敛。

参考资料:https://www.cnblogs.com/maohai/p/6453417.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: