首页 > 解决方案 > CNN 模型在达到 50% 的准确率后过度拟合数据

问题描述

我正在尝试根据 EEG 连接组数据识别 3 种(类)心理状态。数据的形状为 99x1x34x34x50x130(最初是图形数据,但现在表示为矩阵),分别代表 [subjects, channel, height, width, freq, time series]。为了这项研究,只能输入一个 1x34x34 图像的连接组数据。从之前的研究中发现,alpha 波段(8-1 hz)提供的信息最多,因此数据集缩小到 99x1x34x34x4x130。以往机器学习技术(例如 SVM)的测试集准确度达到了约 75% 的测试准确度。因此,目标是在给定相同数据 (1x34x34) 的情况下实现更高的准确度。由于我的数据非常有限,1-66 用于训练和 66-99 用于测试(固定比率并具有 1/3 类分布),我想沿时间序列轴(第 6 轴)拆分数据,然后将数据平均为 1x34x34 的形状(例如 1x34x34x4x10,10 是时间序列的随机样本)。这给了我大约 1500 个样本用于训练,33 个样本用于测试(测试是固定的,类分布是 1/3)。

模型:

SimpleCNN(
  (conv1): Conv2d(1, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  (conv2): Conv2d(32, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))    
  (pool1): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  (drop1): Dropout(p=0.25, inplace=False)
  (fc1): Linear(in_features=9248, out_features=128, bias=True)
  (drop2): Dropout(p=0.5, inplace=False)
  (fc2): Linear(in_features=128, out_features=3, bias=True)
)
CrossEntropyLoss()
Adam (
Parameter Group 0
    amsgrad: False
    betas: (0.9, 0.999)
    eps: 1e-08
    lr: 5e-06
    weight_decay: 0.0001
)

结果:训练集通过足够的迭代可以达到 100% 的准确率,但代价是测试集的准确率。在大约 20-50 个 epoch 的测试之后,模型开始过度拟合训练集,并且测试集的准确度开始下降(与损失相同)。

在此处输入图像描述

我尝试过的:我尝试过调整超参数:lr=.001-000001,权重衰减=0.0001-0.00001。训练到 1000 个 epoch(在不到 100 个 epoch 内没有用的 bc 过拟合)。我还尝试通过添加额外的 fc 层和 CNN 层中不同数量的通道来增加/减少模型复杂性,形成 8-64。我还尝试添加更多的 CNN 层,但该模型在测试集上的平均准确率约为 45%,效果稍差。我尝试每 10 个 epoch 手动安排学习率,结果是一样的。重量衰减似乎对结果影响不大,将其从 0.1 更改为 0.000001。

根据之前的测试,我有一个模型在测试和训练集上都达到了 60% 的准确率。但是,当我尝试重新训练它时,两个集合(训练和测试)的 acc 立即下降到 ~40,这是没有意义的。我尝试将学习率从 0.01 更改为 0.00000001,并为此尝试了权重衰减。

从训练模型和图表来看,模型似乎不知道它在前 5-10 个 epochs 中做了什么,然后开始快速学习到两个集合的大约 50%-60% acc。这是模型开始过度拟合的地方,从那里模型的 acc 在训练集上增加到 100%,而在测试集上的 acc 下降到 33%,这相当于猜测。

有小费吗?

编辑:

测试集的模型输出非常接近。

0.33960407972335815, 0.311821848154068, 0.34857410192489624

每个图像的预测之间的整个测试集的平均标准偏差是(softmax):

0.017695341517654846

然而,训练集的平均标准是.22如此……

F1分数:

Micro Average: 0.6060606060606061
Macro Average: 0.5810185185185186
Weighted Average: 0.5810185185185186
Scores for each class: 0.6875 0.5 0.55555556

这是一个混淆矩阵: 在此处输入图像描述

标签: pythonmachine-learningdeep-learningpytorchconv-neural-network

解决方案


我有一些建议,我会尝试什么,也许你已经做到了:

  • 增加 dropout 的概率,这可能会减少过度拟合,
  • 我没看到或者我错过了,但如果你不这样做,洗牌所有的样品,
  • 没有那么多数据,你有没有想过用其他的神经网络来生成更多分数最低的类的数据?我不确定这里是否是这种情况,但即使是随机旋转,缩放图像也可以产生更多的训练示例,
  • 您可以采取的另一种方法,如果您还没有这样做,请使用另一个流行的 CNN 网络使用迁移学习,看看它是如何完成工作的,然后您可以进行一些比较,无论是您的架构有问题还是缺少示例:) 我知道这些只是建议,但也许,如果您没有尝试其中的一些,它们会让您更接近解决方案。祝你好运!

推荐阅读