训练精度提高但验证精度仍然是每个班级的机会(1/班级数)
Posted
技术标签:
【中文标题】训练精度提高但验证精度仍然是每个班级的机会(1/班级数)【英文标题】:Training Accuracy Increasing but Validation Accuracy Remains as Chance of Each Class (1/number of classes) 【发布时间】:2021-09-06 17:16:57 【问题描述】:我正在 Pytorch 中使用 CNN 训练分类器。我的分类器有 6 个标签。每个标签有 700 个训练图像,每个标签有 10 个验证图像。批量大小为 10,学习率为 0.000001。每个类占整个数据集图像的 16.7%。我已经训练了 60 个 epoch,架构有 3 个主要层:
-
Conv2D->ReLU->BatchNorm2D->MaxPool2D>Dropout2D
Conv2D->ReLU->BatchNorm2D->扁平化->Dropout2D
Linear->ReLU->BatchNorm1D->Dropout 最后是一个全连接和
一个softmax。
我的优化器是 AdamW,损失函数是交叉熵。随着训练准确度的提高,网络训练得很好,但验证准确度几乎保持不变,并且与每个类的机会相等(1/类数)。准确度如下图所示:
Accuracy of training and test
而损失显示在:
Loss for training and validation
知道为什么会发生这种情况吗?如何提高验证准确性?我也使用了 L1 和 L2 正则化以及 Dropout 层。我也尝试添加更多数据,但这些都没有帮助。
【问题讨论】:
【参考方案1】:已解决的问题:首先,我将此问题视为过拟合,并在正则化和增强等方法上花费了大量时间来解决此问题。最后,在尝试了不同的方法后,我无法提高验证的准确性。因此,我浏览了数据。我在数据准备中发现了一个错误,导致在不同的标签下生成了类似的张量。我生成了正确的数据,问题在一定程度上得到了解决(验证准确率提高了 60% 左右)。最后我通过添加更多“conv2d + maxpool”层将验证准确率提高到 90%。
【讨论】:
【参考方案2】:这不是一个与编程相关的问题,所以可以在cross-validated 再问一次 如果您发布架构代码会更容易。 但我建议以下几点:
您写道您“尝试添加更多数据”,如果可以,请始终使用您拥有的所有数据。如果这仍然不够(即使是),请使用增强(例如翻转、裁剪、向图像添加噪点) 你的学习率不应该这么小,从 0.001 开始并在训练时衰减或尝试 ~ 0.0001 而不会衰减 删除 conv 层之后的 dropout 和密集层之后的 batchnorm,看看是否有帮助,在 conv 之后使用cropout 并不常见,但通常不会产生负面影响。还是试试吧【讨论】:
谢谢@Theodor。我找到了这个问题背后的原因。我现在将其发布为答案。以上是关于训练精度提高但验证精度仍然是每个班级的机会(1/班级数)的主要内容,如果未能解决你的问题,请参考以下文章
高精度加法讲解-And-2021年ACM竞赛班训练2021.5.13-问题 E: Python大法好-题解
高精度加法讲解-And-2021年ACM竞赛班训练2021.5.13-问题 F: 最遥远的距离-题解