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

来源:互联网 发布:html用js做打字效果 编辑:程序博客网 时间:2024/05/21 17:31

深度学习交流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

阅读全文
0 0
原创粉丝点击