需要采取什么措施来对抗过度拟合?

问题描述 投票:0回答:1

我正在 Chestxray 数据集上训练 ResNet50。我的训练数据约为 15000 个样本,1500 个用于验证,3000 个用于测试。这是一个多标签分类问题,我有 13 个标签,其中一个对其进行了热编码。我在训练时遇到问题。尽管观察到训练准确性在多个时期内有所提高,但验证准确性似乎有所下降。我尝试了多次实验和故障排除步骤,但未能解决此问题。

尝试过的实验:

  1. 数据增强。
    transforms.Compose([
    transforms.RandomAutocontrast(p=0.5),         
    transforms.RandomHorizontalFlip(),       
    transforms.ToTensor(),       
    transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])
  1. 增加/降低学习率。
  2. 在所有层、少数层等上进行训练。 (我想可能是我的数据集很大而且有点复杂,所以我应该深入训练我的网络,以便它可以了解特征)
  3. 增加批量大小。目前使用32。
  4. 正则化(退出,当我使用时,验证会改善,但火车会下降)。

我使用了 Resnet 的不同变体,但它不起作用,下面的损失和精度曲线可以向您展示。也许我忽略了一些事情,如果你们知道该怎么做?.

图像示例: 图片

模型架构:

learning_rate = 0.001
early_stopping = EarlyStopping(monitor='val_accuracy', patience=10, restore_best_weights=True)
adam_optimizer = Adam(learning_rate=learning_rate)
resnet50 = ResNet50(input_shape=(256, 256, 3), weights='imagenet', include_top=False)

for layer in resnet50.layers:
    layer.trainable = False

x = Flatten()(resnet50.output)
prediction = Dense(13, activation='sigmoid')(x)
model = Model(inputs=resnet50.input, outputs=prediction)

model.compile(optimizer=adam_optimizer, loss='binary_crossentropy', metrics=['accuracy'])

history = model.fit(train_dataset,epochs=100,validation_data=val_dataset,
          callbacks[early_stopping])

输出:

Epoch 1/100
477/477 [==============================] - 48s 88ms/step - loss: 0.8895 - accuracy: 0.1362 - val_loss: 0.5471 - val_accuracy: 0.1835
Epoch 2/100
477/477 [==============================] - 39s 81ms/step - loss: 0.6483 - accuracy: 0.2059 - val_loss: 0.7141 - val_accuracy: 0.1175
Epoch 3/100
477/477 [==============================] - 39s 82ms/step - loss: 0.6154 - accuracy: 0.2471 - val_loss: 0.4956 - val_accuracy: 0.3182
Epoch 4/100
477/477 [==============================] - 39s 82ms/step - loss: 0.5840 - accuracy: 0.2784 - val_loss: 0.6674 - val_accuracy: 0.1464
Epoch 5/100
477/477 [==============================] - 39s 81ms/step - loss: 0.5519 - accuracy: 0.3058 - val_loss: 0.7490 - val_accuracy: 0.1533
Epoch 6/100
477/477 [==============================] - 39s 81ms/step - loss: 0.5033 - accuracy: 0.3369 - val_loss: 0.7575 - val_accuracy: 0.1354
Epoch 7/100
477/477 [==============================] - 39s 81ms/step - loss: 0.5321 - accuracy: 0.3396 - val_loss: 0.7116 - val_accuracy: 0.1230
Epoch 8/100
477/477 [==============================] - 39s 82ms/step - loss: 0.4538 - accuracy: 0.3678 - val_loss: 0.5930 - val_accuracy: 0.1753
Epoch 9/100
477/477 [==============================] - 39s 81ms/step - loss: 0.4576 - accuracy: 0.3766 - val_loss: 0.6753 - val_accuracy: 0.1072
Epoch 10/100
477/477 [==============================] - 39s 82ms/step - loss: 0.4989 - accuracy: 0.3758 - val_loss: 0.6825 - val_accuracy: 0.1168
Epoch 11/100
477/477 [==============================] - 39s 82ms/step - loss: 0.5037 - accuracy: 0.3859 - val_loss: 0.7811 - val_accuracy: 0.2144
Epoch 12/100
477/477 [==============================] - 39s 81ms/step - loss: 0.5155 - accuracy: 0.3881 - val_loss: 0.8082 - val_accuracy: 0.1402
Epoch 13/100
477/477 [==============================] - 39s 82ms/step - loss: 0.5550 - accuracy: 0.3884 - val_loss: 0.9528 - val_accuracy: 0.2419

目前,这是上述架构的结果,请建议我现在应该做什么来改善结果?

图表曲线:

损失和准确度图

python machine-learning deep-learning neural-network conv-neural-network
1个回答
0
投票
  • 训练准确率和损失似乎是合理的。
  • 验证看起来不太好。
  • 图像应进行类似于下图的预处理:

enter image description here

  • 您工作的核心部分与实体图像预处理策略、图像对齐(例如,可能识别脊柱并使其成为每个图像的中心)、颜色归一化等相关。

  • 您可以寻找特征提取算法,看看是否可以从这些图像中提取特征(我确信这是可能的)。那么,你的整个解决问题的策略就会彻底改变。

  • 请注意,您的目标是获得准确性并找到手头问题的解决方案。这不是为了训练另一个平庸的网络。否则就没有价值了


网络

  • 就网络而言,图像处理完成后,您将决定如何继续。优化架构可能是一种方法。

  • 我会像你一样使用纪元数、批量大小等。请注意,如果涉及神经网络,系统的输入占工作量的 50% 以上。

  • 如果您有CPU和内存,请制作一个干净且小的输入数据集。然后,暴力破解架构。这意味着对于各种架构,使用相同的初始权重和常量运行网络,并查看输出在哪些范围内提供更高的精度。

总结

  • 总而言之,这一切都归结为你工作的图像处理部分。其他的都是次要的。

参考

© www.soinside.com 2019 - 2024. All rights reserved.