过拟合主要包括
- 建模样本选取有误。
- 样本噪音干扰过大。
- 假设的模型无法合理存在,或者说是假设成立的条件实际并不成立。
- 参数太多,模型复杂度过高。
- 对于神经网络模型:
a) 对样本数据可能存在分类决策面不唯一,随着学习的进行,,BP算法使权值可能收敛过于复杂的决策面;
b) 权值学习迭代次数足够多(Overtraining),拟合了训练数据中的噪声和训练样例中没有代表性的特征。
解决方法主要包括
-
利用现有深度学习手段增加数据(翻转,平移,随机裁剪,imgaug)
-
利用 dropout层(一般dropout=0.5)
-
利用正则化,例如图片需要把RGB值除以255。
L1正则化通过让原目标函数加上了所有特征系数绝对值的和来实现正则化,而L2正则化通过让原目标函数加上了所有特征系数的平方和来实现正则化。 -
在分验证集之前打乱数据
因为validation_split操作不会为你shuffle数据,所以如果你的数据前一半标签全是1 ,后一半全是0,validation=0.5,则训练集全是1,验证集全是0。 -
检查是否pycharm的debug模式
如果使用pycharm,调试模式,会达到损失下降,但是准确率会卡成常数。 -
检查数据和标签没有对上
有可能再读取自定义的数据库的时候出现问题,导致数据与标注不对应。比如第一张图片用第十张的标注 -
增加训练数据
若训练数据太少,validation数据太多,类别太多,比如4000张训练,1000张validation,300类,这显然就是不合理的 -
最好使用预训练的权重
大多数流行的backone比如resnet都有再imagenet数据集上与训练过,那么使用这种权重,比起随即重新训练,显然要可靠不少 -
设置Weight Delay等,在loss中增加正则项(惩罚项,减小不重要的参数对最后结果的影响,网络中有用的权重则不会收到Weight decay影响)
-
使用更简单的模型,减少网络参数,降低网络结构复杂度
————————————————
参考: