遇到问题:用YOLO训练自己的数据集,在训练集图片上,测试效果很好,换成测试集图片或者其他图片,测试效果极差。而且10000次就开始收敛了,然后又继续训练到50000次,这个过程Loss值一直稳定0.1左右,不再下降——经过查阅资料,最大可能性就是过拟合了

(一)过拟合现象

有时我们发现,模型在训练集上效果很好,但是在测试集上效果不好,这种现象称为过拟合

(二)解决办法

1.增加样本数据量

2.数据增强,人为扩展数据量

3.正则化: 正则化之所以能够降低过拟合的原因在于,正则化是结构风险最小化的一种策略实现。 给loss function加上正则化项,能使得新得到的优化目标函数h = f+normal,需要在f和normal中做一个权衡,如果还像原来只优化f的情况下,那可能得到一组解比较复杂,使得正则项normal比较大,那么h就不是最优的,因此可以看出加正则项能让解更加简单,通过降低模型复杂度,得到更小的泛化误差,降低过拟合程度。

4.Dropout: 在前向传播时,某个神经元的激活值以一定的概率p停止工作,随机地删除网络中的一般隐藏的神经元,这样可以使模型泛化性更强,因为它不会太依赖某些局部的特征,从而解决过拟合问题 一般取值为0.3或0.5 。

5.early stopping 在训练中计算模型在验证集上的表现,当模型在验证集上的表现开始下降的时候,停止训练,这样就能避免继续训练导致过拟合的问题 。

既然出现过拟合,尝试用前几次保存下来的权重测试一下,不用最终的权重。是不是前面保存的权重效果可能会好点呢?

验证一下:发现测试效果并不好。

(三)经验之谈

  1. 不能检测出自己的数据集,是指训练集还是测试集,一般理解肯定是自己的测试集,那么有两种可能,一种是你的网络过拟合了,第二种是训练集和测试集几乎没有关联性。
  2. 假设1:用训练集A训练,之后检测训练集A中的数据,发现不能检测。算法完全没有学习,甚至都没有出现过拟合,可能是训练数据不足、学习率过大等问题导致的。
    假设2:用训练集A训练,之后检测测试集B中的数据,发现不能检测。可能性1:训练集A和测试集B中的数据关联性不强,YOLO没能很好的将从训练集A中的学习到的检测能力扩展到测试集B上。可能性2:假设1中提到的问题。可能性3:需要检测的目标在图片中占据区域较小,因为YOLO是将图片分成13*13(应该是吧)个格子,每个格子进行预测的,每个格子对应预测图像中一定区域内是某个目标的可能性。当目标只占据一个格子的很小区域时,预测的可信度不高,也就预测不出来。