YunYang1994 / tensorflow-yolov3

🔥 TensorFlow Code for technical report: "YOLOv3: An Incremental Improvement"
https://yunyang1994.gitee.io/2018/12/28/YOLOv3-算法的一点理解/
MIT License
3.63k stars 1.35k forks source link

关于focalloss的梯度以及从scratch开始训练的问题? #406

Closed hanxu1202 closed 4 years ago

hanxu1202 commented 4 years ago

作者你好,最近再用你的代码做实验,十分感谢,训练过程中有几个问题想请教一下

1.对于focalloss,我的理解是仅作为系数,那么虽然计算过程中用了预测的结果,但是不是不应该计算这块的梯度,也就是用stop_gradient?还是说因为本身focal也在引导confidence向正确标签靠近所以应当计算其梯度?另外yolov3的论文提到focalloss对yolo没有提升,请问你在实验的时候加入focalloss有提升吗?

2.作者提供的训练好的模型,我测试了一下map有60多,超过yolo官方给的map好多。是加载了yolo官方给的权重进行finetune的吗?还是只有backbone用了预训练模型?还是完全从scratch开始训练的呢?大概用了多少epoch达到这个结果?

3.我尝试完全从头开始在coco数据集训练,如果开启数据增强,不管学习率设置多大,总会出现trainloss变为nan的情况,目前尝试过0.01,0.001,0.0001,并且试过加入warmup。而且这种情况似乎是完全随机的,经常在正常训了7、8个epoch之后出现,出现之前训练优化过程一切正常,调低学习率也只能延缓nan出现的时间,怀疑是数据增强导致产生一些极端数据使得训练不稳定?如果关掉数据增强目前可以正常训练,但是模型收敛异常的快,batchsize设置为8,输入恒为416,基本10个epoch左右,testloss就基本稳定并开始震荡,而且prob和confidence的loss很高,大概在十到二十几之间,在测试集(2017val)上甚至开始略微增大,出现过拟合的倾向(训练集的loss正常下降),如果调低学习率也只能在1个epoch左右稍微下降,然后又开始震荡。使用训练的模型将score_threshold设置为0.01测试的map只有30多,我观察了pred的结果发现正确预测的confi都很低,通常最大也就在0.3到0.7左右,请问对这种现象有什么头绪吗?我怀疑是模型初始化的数值不好导致训练过程不稳定且容易收敛到局部最优,目前在尝试预训练一个backbone。

最近半个多月训练过程记录的问题,写的有点长,麻烦作者给点建议,十分感谢。

YunYang1994 commented 4 years ago
  1. 加入 Focal loss 主要是为了解决模型在训练时遇到的 easy example 和 hard-example 的数目不平衡问问题,这对模型收敛和训练都很有帮助。

  2. 我提供这个预训练权重是在作者基础上进行fine-tuning的结果,所以效果比YOLO官方的更好也是比较正常。

  3. 如果你从头训练 COCO ,不加载 backbone 权重的话是比较难以训练的。因为目前的目标检测套路都是先对 backbone 进行图像分类训练,然后再在目标检测数据集上进行 fine-tuning,还没听说过可以直接训练 COCO一步到位的,你去看看经典的 Faster-RCNN 或者 Mask-RCNN 网络,哪个不是先加载 backbone 权重进行训练的?COCO 比较难训练是很正常的,这主要是因为它的目标场景特别多,不仅有类别不均衡的问题,还有尺寸分布不均一的情况:

所以建议你首先预训练一个backbone(图像分类),然后再加载它fine-tuning进行目标检测训练。

hanxu1202 commented 4 years ago

谢谢作者的回复