CNN模型学不好

Posted

技术标签:

【中文标题】CNN模型学不好【英文标题】:CNN model is not learn well 【发布时间】:2021-09-02 09:45:30 【问题描述】:

我开始在 PyTorch 中学习 CNN 实现,并尝试构建 CNN 来处理从 0 到 3 的 4 个类别的灰度图像。我的初始准确度在 0.55 左右。我得到的最大准确率约为 0.683%。

我尝试了使用不同的 lr 和 batch_size 值的 SGD 和 Adam 优化器,但准确率仍然很低。

我使用数据增强来创建更多样本,大约 4k。

我无法进一步提高准确性,想知道是否可以就我需要更改 CNN 结构以提高准确性获得一些建议。 损失开始于:损失:[1.497] 然后在附近减少:损失:[0.001] 然后围绕该值上下波动。

我花时间阅读了类似的问题,但没有运气。 我正在为我的 loss_fn 使用 nn.CrossEntropyLoss()。我不将 softmax 用于密集层。

这是CNN模型的总结:

-------------------------------------------------------------
        Layer (type)               Output Shape         Param #
=============================================================
            Conv2d-1         [-1, 32, 128, 128]             320
              ReLU-2         [-1, 32, 128, 128]               0
       BatchNorm2d-3         [-1, 32, 128, 128]              64
         MaxPool2d-4           [-1, 32, 64, 64]               0
            Conv2d-5           [-1, 64, 64, 64]          18,496
              ReLU-6           [-1, 64, 64, 64]               0
       BatchNorm2d-7           [-1, 64, 64, 64]             128
         MaxPool2d-8           [-1, 64, 32, 32]               0
            Conv2d-9          [-1, 128, 32, 32]          73,856
             ReLU-10          [-1, 128, 32, 32]               0
      BatchNorm2d-11          [-1, 128, 32, 32]             256
        MaxPool2d-12          [-1, 128, 16, 16]               0
          Flatten-13                [-1, 32768]               0
           Linear-14                  [-1, 512]      16,777,728
             ReLU-15                  [-1, 512]               0
          Dropout-16                  [-1, 512]               0
           Linear-17                    [-1, 4]           2,052
============================================================

我将不胜感激。

【问题讨论】:

【参考方案1】:

训练集中有多少张图片?测试集?图片的尺寸是多少?您如何考虑图像分类的难度?你认为它应该简单还是困难?

根据您拥有的数字,您过度拟合了,因为您的损失接近 0(这意味着没有什么会反向传播到权重,即您的模型不会再改变)和您的 68.3%(这是一个错字,对吗?)来自测试集(我想)。所以你训练网络没有任何问题,这是一个好点。

然后您可以在线搜索对抗过度拟合的方法,这里有一些“经典”的可能性: - 你可以提高 dropout 参数 - 放置一些正则化器(L1 或 L2)来限制学习 - 提前停止使用验证集 - 使用带有/不带有预训练权重的经典和/或更轻的卷积网络(resnet、inception)。后者还取决于您的图像类型(自然、生物医学......) - ...或多或少难以实施

从技术上讲,您正在使用 softmax 层,因为它包含在 pytorch 的交叉熵损失中。

【讨论】:

数据集大约有 170 个样本,但通过数据增强和预处理,我将样本增加到 3500 个。训练集大小为 80%,测试集为 20%。是的,68.3% 是测试准确度。关于过拟合问题:我对所有层都使用了 dropout:对于前两层(Conv2d),我使用了 0.25 这个值。对于最后一层(Conv2d),我使用了 0.3。对于密集层,我将值设置为 0.5。我在 50 个 epoch 后获得了大约 70% 的准确度,然后在 290 个 epoch 后最大准确度为 78.5%,但在 300 个 epoch 后下降到 71.7。我也会尝试其他解决方案。 图片大小为 521x512 但我将它们调整为 128。

以上是关于CNN模型学不好的主要内容,如果未能解决你的问题,请参考以下文章

对于不同的数据集,同一个 CNN 模型是不是需要不同的学习率?

机器学习 | 卷积神经网络初识

对比学习用 Keras 搭建 CNN RNN 等常用神经网络

深度学习之文本分类模型-基于CNNs系列

深度学习之文本分类模型-基于CNNs系列

用RNN & CNN进行情感分析 - PyTorch