1

我正在 Pytorch 中使用 CNN 训练分类器。我的分类器有 6 个标签。每个标签有 700 个训练图像,每个标签有 10 个验证图像。批量大小为 10,学习率为 0.000001。每个类占整个数据集图像的 16.7%。我已经训练了 60 个 epoch,架构有 3 个主要层:

  1. Conv2D->ReLU->BatchNorm2D->MaxPool2D>Dropout2D
  2. Conv2D->ReLU->BatchNorm2D->展平->Dropout2D
  3. Linear->ReLU->BatchNorm1D->Dropout 最后是全连接和softmax。我的优化器是 AdamW,损失函数是交叉熵。随着训练准确度的提高,网络训练得很好,但验证准确度几乎保持不变,并且与每个类的机会相等(1/类数)。准确度如下图所示:

训练和测试的准确性

损失显示在:

训练和验证的损失

有什么想法为什么会发生这种情况?如何提高验证准确性?我也使用了 L1 和 L2 正则化以及 Dropout 层。我也尝试添加更多数据,但这些没有帮助。

4

2 回答 2

1

解决的问题:首先,我将这个问题视为过度拟合,并在正则化和增强等方法上花费了大量时间来解决这个问题。最后,在尝试了不同的方法后,我无法提高验证的准确性。因此,我浏览了数据。我在数据准备中发现了一个错误,导致在不同的标签下生成了类似的张量。我生成了正确的数据,问题在一定程度上得到了解决(验证准确率提高了 60% 左右)。最后,我通过添加更多“conv2d + maxpool”层将验证准确率提高到 90%。

于 2021-06-29T07:45:28.077 回答
0

这不是一个与编程相关的问题,因此可能会在交叉验证中再次询问, 如果您发布架构代码会更容易。但这里有一些事情我会建议:

  • 您写道您“尝试添加更多数据”,如果可以,请始终使用您拥有的所有数据。如果这仍然不够(即使是)使用增强(例如翻转、裁剪、向图像添加噪声)
  • 你的学习率不应该那么小,从 0.001 开始并在训练时衰减或尝试 ~ 0.0001 而不会衰减
  • 去除卷积层之后的 dropout 和密集层之后的 batchnorm,看看是否有帮助,在 conv 之后使用cropout 并不常见,但通常不会产生负面影响。还是试试吧
于 2021-06-23T07:34:51.550 回答