问题原因:
- 学习率设置太高,一个epoch直接收敛,所以损失不会下降。又没有设置防止过拟合的比如学利率一开始设置为1,因为下降太快,那么很有可能在一个epoch旧完全收敛。所以看到的validation数值并不下降,第一个epoch就已经处于谷底了。
- 最常见的原因:过拟合。主要包括:数据量小,网络复杂,
- learning rate 比较高,又没有设置任何防止过拟合的机制
解决方法:
- 简化模型,且进行数据增强,如:翻转,平移,随机裁剪等
- 利用 dropout层
- 利用正则化normalization
- 没有在分验证集之前打乱数据
- 数据和标签没有对上
- 训练数据太少,validation数据太多,类别也太多,解决方法:1.使用别的大的数据集预训练; 2.使用数据增强; 3.可以考虑迁移学习
- 使用预训练的权重,比较流行的backone网络,如vgg16等都有在imagenet数据集预训练的权重,使用这种权重,效果更好。
- 网络结构有问题。可以通过使用现在流行的网络(resnet,unet等)替入你的代码,如果结果没有问题,你的结果有问题那么肯定就是你网络结构出问题了。那么可以通过逐层注释掉排查究竟哪里出了问题。
- 网络最后一层没有使用正确的激活函数,比如多类别数据的应该使用softmax进行处理;
- relu处理后面是softmax。有一些说法是relu由于对于很大的数值直接复制,所以会对softmax产生不好的影响,从而输出不好的结果。所以可以使用tanh代替relu。
- batch normalization需要batch size至少16张
- 可能设置了一些参数是不可训练的。在训练语句之前,检查以下你的trainable参数,是否设置了一些参数是不可训练的。