CNN 模型在达到 50% 的准确率后过度拟合数据

Adi*_*dre 5 python machine-learning deep-learning conv-neural-network pytorch

我正在尝试根据 EEG 连接组数据识别 3(类)心理状态。数据的shape是99x1x34x34x50x130(原来是图形数据,现在用矩阵表示),分别代表[主题、通道、高度、宽度、频率、时间序列]。为了这项研究,只能输入连接组数据的 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
)
Run Code Online (Sandbox Code Playgroud)

结果:训练集可以通过足够的迭代达到 100% 的准确度,但以牺牲测试集的准确度为代价。经过大约 20-50 轮测试后,模型开始过度拟合训练集,测试集精度开始下降(与损失相同)。

在此处输入图片说明

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

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

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

有小费吗?

编辑:

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

0.33960407972335815, 0.311821848154068, 0.34857410192489624
Run Code Online (Sandbox Code Playgroud)

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

0.017695341517654846
Run Code Online (Sandbox Code Playgroud)

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

F1分数:

Micro Average: 0.6060606060606061
Macro Average: 0.5810185185185186
Weighted Average: 0.5810185185185186
Scores for each class: 0.6875 0.5 0.55555556
Run Code Online (Sandbox Code Playgroud)

这是一个混淆矩阵: 在此处输入图片说明

小智 3

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

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