我的模型的训练精度和验证精度非常高。
...
Epoch 4/5
457/457 [==============================] - 4s 8ms/step - loss: 0.0237 - accuracy: 0.9925 - val_loss: 0.0036 - val_accuracy: 0.9993
Epoch 5/5
457/457 [==============================] - 4s 8ms/step - loss: 0.0166 - accuracy: 0.9941 - val_loss: 0.0028 - val_accuracy: 0.9994
然而,经过测试,准确度非常糟糕:
(为了高精度,从左上角到右下角会有一条绿色对角线)
考虑到训练集和验证集的准确性高且损失低,我不确定这是为什么。如果模型过度拟合,则验证损失或准确性应该偏离训练损失或准确性,但事实并非如此。 这是我的数据生成器:
train_datagen = DataGenerator(
partition["train"],
labels,
batch_size=BATCH_SIZE,
**params
)
val_datagen = DataGenerator(
partition["val"],
labels,
batch_size=BATCH_SIZE,
**params
)
test_datagen = DataGenerator(
partition["test"],
labels,
batch_size=1,
**params
)
请注意,由于我的数据采用 .npy 文件上的 npy 数组的形式,因此我按照这篇文章创建了一个自定义数据生成器类。
这是我的训练过程:
history = model.fit(
train_datagen,
epochs = 5,
steps_per_epoch = len(train_datagen),
validation_data = val_datagen,
validation_steps = len(val_datagen),
shuffle = False,
callbacks = callback,
use_multiprocessing = True,
workers = 4
)
在这里您可以看到我如何对数据进行分区:
print(len(partition["train"]))
print(len(partition["val"]))
print(len(partition["test"]))
print(len(partition["train"]) + len(partition["val"]) + len(partition["test"]))
print(good, ok, bad)
# good: 0, ok: 1, bad: 2
29249
8342
4144
41735
18152 12665 10918
我还确认任何组之间都没有重叠:
print(bool(set(partition["train"]) & set(partition["val"])))
print(bool(set(partition["test"]) & set(partition["val"])))
print(bool(set(partition["train"]) & set(partition["test"])))
False
False
False
有人可以帮我找出我错在哪里吗?我不确定如何获得如此高的测试和验证准确性,但测试率却很糟糕。我已在 Github 上托管了我的完整代码和文件。