yolov5 训练完模型以后发现 对测试图片的识别效果不好. 那么这个时候该怎么办呢?
是过拟合还是欠拟合了呢? 怎么判断呢?
欠拟合
机器学习中一个重要的话题便是模型的泛化能力,泛化能力强的模型才是好模型,对于训练好的模型,若在训练集表现差,在测试集表现同样会很差,这可能是欠拟合导致, 这是泛化能力太强, 训练集上和测试集上误识别比较高.
欠拟合解决方法
-
最简单的是增加数据集的正样本数, 增加主要特征的样本数量
-
增加训练次数. 有可能是你还没有训练到合适的次数, 网络还没有学习到特征就被你停止掉了
-
添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。
-
添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。例如上面的图片的例子。
-
减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。
过拟合
若在训练集表现非常好,在测试集表现很差,这可能是过拟合导致
例如易拉罐在训练集上的图片能识别, 但是在测试集上就不能识别. 此为过拟合的表现.
过拟合解决方法
-
最简单的是增加其他的特征的样本数, 重新训练网络.
-
重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。
-
增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。
-
采用正则化方法。正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。但是在机器学习中一般使用L2正则,下面看具体的原因。
L0范数是指向量中非0的元素的个数。L1范数是指向量中各个元素绝对值之和,也叫“稀疏规则算子”(Lasso regularization)。两者都可以实现稀疏性,既然L0可以实现稀疏,为什么不用L0,而要用L1呢?个人理解一是因为L0范数很难优化求解(NP难问题),二是L1范数是L0范数的最优凸近似,而且它比L0范数要容易优化求解。所以大家才把目光和万千宠爱转于L1范数。
L2范数是指向量各元素的平方和然后求平方根。可以使得W的每个元素都很小,都接近于0,但与L1范数不同,它不会让它等于0,而是接近于0。L2正则项起到使得参数w变小加剧的效果,但是为什么可以防止过拟合呢?一个通俗的理解便是:更小的参数值w意味着模型的复杂度更低,对训练数据的拟合刚刚好(奥卡姆剃刀),不会过分拟合训练数据,从而使得不会过拟合,以提高模型的泛化能力。还有就是看到有人说L2范数有助于处理 condition number不好的情况下矩阵求逆很困难的问题(具体这儿我也不是太理解)。
- 采用dropout方法。这个方法在神经网络里面很常用。dropout方法是ImageNet中提出的一种方法,通俗一点讲就是dropout方法在训练的时候让神经元以一定的概率不工作。具体看下图:
如上图所示,左边a图是没用用dropout方法的标准神经网络,右边b图是在训练过程中使用了dropout方法的神经网络,即在训练时候以一定的概率p来跳过一定的神经元。
下面内容跟本文有点相关. 算是一点工作心得吧
经过长期的摸索和实验. 总结出来了下面的几个点.
目前来看, 我感觉视觉类神经网络要想能达到实用的阶段, 首先要重视训练用数据集的管理.
在讨论之前我们应该要明白,目前的神经网络是怎么工作的. 咱们不讲太细如何实现的.咱讲的粗一点.
目前的视觉类神经网络最主要的功能, 就是在数据集和人工给的标准答案之间建立起一个映射模型.
这个模型是如何生成的呢? 视觉神经网络分三个阶段完成此功能,
第一个阶段是提取特征, 把图片拆分成不同的一个个的小特征.例如角点,轮廓,颜色,形状,明亮度
第二个阶段是用提取的特征,和标准答案通过多项式公式建立起关联关系, 不断的调整多项式的参数最终达到预测结果和识别结果一致.
而且这个模型有一定的泛化能力, 通俗的讲就是可以举一反三… 这确实是可以的, 因为它的原理是计算每个特征的权重占比来归类的. 是个概率性答案. 而不是1+1=2的确定性问题… 但是能不能做到举一反四, 举一反五, 呢.这个目前还做不到.
既然是概率性答案 那么就一定存在着答案不正确的可能性…也就是说识别不正确.
简单概括一下, 数据集中一定要有知识 也就是特征, 主要特征的数据不能少, 也不能只有一两个主特征.
第一个是 数据集图片中必须包含能够体现要识别的物品的一些主要特征. 例如,瓶子和罐子, 说到瓶子一般都是上面口小下面身子大的形状, 你把瓶子和罐子混合着标注,
罐子 一般是上面开口大,下面身体差不多一样大的形状. 这两种物品的训练数据集就不能随便混淆, 虽然有的时候人类也会把直通的罐子叫瓶子, 例如营养快线的瓶子开口就很大. 还有水蜜桃的罐子也有的时候叫瓶子, 但是这对于电脑来说等于增加了不确定性, 导致无法拟合. 也就是说数据集的正样本要能突出物品的主要特征.
第二个是数据集中表现主要特征的图片不能太少,越多越容易提取到主要特征. 尽量的各种角度都有.现在的神经网络还没有立体三维的关联性推导能力还只是平面性的求共同特征,找规律.还没有联想,立体翻滚的能力. 特征多才可以保证在各种情况下都能识别物品. 举个例子, 现在神经网络识别人的效果很好, 由于数据集非常非常多的样本都是正面或侧面拍的. 即便是训练的再怎么好. 你让它识别从裙底下面偷拍的哪些图片. 它照样不认识… 除非你把大量的这种图片加进去. 它也照样能学会. 这叫数据集内蕴含知识.找规律.找特征.仅此而已.
第三个是 数据集中体现一个物品的图片一定不能只有一个特征, 应该尽可能的包含所有的特征. 一个物品最起码应该有很5个以上的特征, 才容易有很好的泛化效果, 举个例子, 毛茸茸这个特征,可以是什么物品的主要特征? 这就太多了. 可以是玩具, 猫,狗,头发, 羽绒服.
总结
通过冷静的分析和思考. 可以发现, 要想学习到知识, 效果要想达到最好, 首先需要有大量的数据集而且要是比较好的数据集. 标注正确合理不要指鹿为马. 选图集中突出几个主要特征(注意是几个). 外加几个边缘样本…
上面关于数据集的的要求是纯粹的靠推理就可以想明白的事情. 我想应该不用证明大家也能明白.
太少了容易欠拟合, 导致它很难识别不同的物品, 例如 王老吉饮料瓶, 把红色也当做王老吉的重要特征… 数据集也不能训练的太多, 训练的次数太多也容易过拟合.
训练的过程就是一个不断试错拟合的过程. 不断的调整模型参数 适应结果. 它也不知道这个参数是什么意义. 所以会得到各种乱七八糟的结果.
要想解决数据集缺少的问题, 我感觉, 弄个物品360度拍照, 作为基础的物品照片. 然后跟背景图片混合形成各种照片, 基本上能达到很好的识别效果. 然后在加上后期我们一些真实数据的照片, 基本上是可以做到效果实用的.
这里面算力就变的很重要了… 目前来看, 每次训练的结果是可以提高后续的训练速度的. 后期的训练应该会比刚开始要快, 因为参数已经都调整到位了.
后续增加物品品类也是可以的, 必须保证数据集和模型一致,每次新增的品类必须在已有品类的后面增加. 要不然会导致前面的网络重新训练.