测试准确性差,但具有非常好的训练和验证准确性

Posted

技术标签:

【中文标题】测试准确性差,但具有非常好的训练和验证准确性【英文标题】:Poor testing accuracy, while having very good training and validation accuracy 【发布时间】:2021-11-12 20:01:27 【问题描述】:

我有一个奇怪的表现,我无法解释。在我的网络训练期间,在我完成训练批次的计算之后,我直接检查验证集并获取一个批次并在其上测试我的模型。因此,我的验证不是在与培训不同的步骤中完成的。但我只是进行了一批训练,然后进行了一批验证。

我的代码看起来类似于:

for (data, targets) in tqdm(training_loader):
output = net(data)
log_p_y = log_softmax_fn(output)
loss = loss_fn(log_p_y, targets)

# Do backpropagation

val_data = itertools.cycle(val_loader)
valdata, valtargets = next(val_data)
val_output = net(valdata)
log_p_yval = log_softmax_fn(val_output)
loss_val = loss_fn(log_p_yval, valtargets)

归根结底,我可以看到我的模型在每个时期都具有非常好的训练和验证准确度。但是,在测试数据上,它并没有那么好。此外,验证损失是训练损失的两倍。

最后测试精度差的原因可能是什么?如果有人能解释我的经历并推荐一些解决方案,我会很高兴:)

这是训练和验证损失的图片。

这是训练和验证准确性的图片。

【问题讨论】:

【参考方案1】:

我很确定非代表性验证数据集中的原因。

一个不具代表性的验证数据集意味着验证数据集没有提供足够的信息来评估模型的泛化能力。 如果与训练数据集相比,验证数据集的示例太少,则可能会发生这种情况。 确保您的训练和测试数据是随机挑选的,并尽可能准确地表示相同的分布和真实分布。

【讨论】:

我的验证数据集大小为 512,训练大小为 2048,测试大小为 640。我应该缩小训练集,另一方面增加测试和验证数据集吗? 您是否对数据进行洗牌?每个训练/验证/测试数据集中每个类的百分比应该大致相同 如果我进行 Stratify 拆分,每个类的百分比将相同,但是,我没有这样做,因为无论如何我的数据集是一个平衡的数据集。并且所有类都在所有数据集拆分中公平呈现。【参考方案2】:

您用于训练、测试和验证的数据集大小是多少?

这里的问题似乎是过度拟合,您可以使用 L1、L2 或 Dropout 等正则化技术进行检查。

【讨论】:

Hi Decode,Validation Loss 还在减少,所以我认为没有过拟合。火车的大小是 2048,测试 640,验证 512。此外,我已经应用了重量衰减。 @Atila 你能提取和分享一些不准确的测试图像吗?这也可能是由于数据集不正确造成的。

以上是关于测试准确性差,但具有非常好的训练和验证准确性的主要内容,如果未能解决你的问题,请参考以下文章

随机森林在训练和测试中获得 98% 的准确率,但总是预测相同的类别

训练准确性提高但验证准确性保持不变

测试和训练数据集具有不同数量的特征

验证测试数据的准确性

训练期间接近 100% 的准确率,但在图像分类器的测试/验证期间 <50%

我的图像分割模型在训练和验证上提供了非常高的准确性,但输出空白掩码