训练精度提高但验证精度仍然是每个班级的机会(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: 最遥远的距离-题解

绘制学习模型的训练损失和验证损失图形绘制训练精度和验证精度图形

训练您的模型并提高召回率/精度的最佳方法是啥?

字符识别--模型集成

字符识别--模型集成