我正在 Chestxray 数据集上训练 ResNet50。我的训练数据约为 15000 个样本,1500 个用于验证,3000 个用于测试。这是一个多标签分类问题,我有 13 个标签,其中一个对其进行了热编码。我在训练时遇到问题。尽管观察到训练准确性在多个时期内有所提高,但验证准确性似乎有所下降。我尝试了多次实验和故障排除步骤,但未能解决此问题。
尝试过的实验:
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])
我使用了 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
目前,这是上述架构的结果,请建议我现在应该做什么来改善结果?
图表曲线:
您工作的核心部分与实体图像预处理策略、图像对齐(例如,可能识别脊柱并使其成为每个图像的中心)、颜色归一化等相关。
您可以寻找特征提取算法,看看是否可以从这些图像中提取特征(我确信这是可能的)。那么,你的整个解决问题的策略就会彻底改变。
请注意,您的目标是获得准确性并找到手头问题的解决方案。这不是为了训练另一个平庸的网络。否则就没有价值了
就网络而言,图像处理完成后,您将决定如何继续。优化架构可能是一种方法。
我会像你一样使用纪元数、批量大小等。请注意,如果涉及神经网络,系统的输入占工作量的 50% 以上。
如果您有CPU和内存,请制作一个干净且小的输入数据集。然后,暴力破解架构。这意味着对于各种架构,使用相同的初始权重和常量运行网络,并查看输出在哪些范围内提供更高的精度。
参考。