训练验证和准确率非常高,但测试准确率较低

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

我的模型的训练精度和验证精度非常高。

...
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 上托管了我的完整代码和文件。

python tensorflow machine-learning keras deep-learning
1个回答
1
投票

好的,经过几个小时的调试,我发现了问题。

我的神经网络在测试数据集上成功达到了 >99% 的准确率,正如训练集和验证集所反映的那样。 4144 个预测中只有 1 个错误。

问题是我为测试数据集打开了洗牌,因此当与开始时生成的正确类的非洗牌列表进行比较时,结果是完全随机的。

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