【深度学习】【卷积神经网络CNN】验证集准确率val_acc保持不变?过拟合?早停earlystoping的使用。

2020/5/9 日记录

今天解决了acc 和val_acc一直为1.000的奇怪问题之后(原来是label标错了o(╥﹏╥)o),终于走上了正式的调参之路。
先看一下训练结果:【深度学习】【卷积神经网络CNN】验证集准确率val_acc保持不变?过拟合?早停earlystoping的使用。_第1张图片
可以看到:
1.验证集准确率val_acc>训练集准确率train_acc。查资料,属于正常情况,不过也有可能有一些问题,先观察着。
2. 随着epoch迭代,验证集准确率val_acc保持不变了!这不就是传说中过拟合的征兆吗?引用另一篇博客的话 :“我们之前把数据集切分为训练集,测试集和验证集。验证集就是用来检测模型overfitting。
一旦在验证集上,准确性不在变化(收敛了),那么我们就停止训练。”

在程序中已经设置了早停earlystoping ,是这样写的:

  # 是否需要早停,当val_loss一直不下降的时候意味着模型基本训练完毕,可以停止
    early_stopping = EarlyStopping(
                            monitor='val_loss', 
                            min_delta=0, 
                            patience=10, 
                            verbose=1
                        )

是以val_loss为监测标准的。min_delta 代表的是容忍度,val_loss最少要下降所少才算数。这里设置的是0,也就是说,只要下降,哪怕是0.0000001也算数,不会停止训练,还是会继续下一个epoch训练。

看这连续4个epoch,val_acc都不变,过拟合实锤了。现在要解决的问题:

val_acc保持不变是怎么个情况?好不好?怎么解决?有可能是什么原因?

以下转载自知乎https://zhuanlan.zhihu.com/p/92729376

“ loss不收敛包含两种情况,一种是loss一直在震荡,一种是loss下降一点后不再下降到理想水平,而验证集上的表现保持不变.”
采取措施如下:

"1.保持需要的batchsize不变;
2.查看是否有梯度回传,查看代码如下:

for name, parms in model.named_parameters():
	print('-->name:', name, '-->grad_requirs:', parms.requires_grad, '--weight', torch.mean(parms.data), ' -->grad_value:', torch.mean(parms.grad))

3.查看数据是否有问题,如标签错乱等现象;
4.调节学习率,从大向小调,建议每次除以5;我的项目即是因为学习率过大过小都不收敛引起的;
5.如果学习率调好后,需要调节batchsize大小,如batchsize调大2倍,则将学习率对应调大(项目测试调大2~3倍OK),反之,学习率对应调小"

总的来说:调参吧。

于是:将学习率初始值改为0.0001,竟然意外地好用:

你可能感兴趣的:(【深度学习】【卷积神经网络CNN】验证集准确率val_acc保持不变?过拟合?早停earlystoping的使用。)