为什么我的测试误差低于训练误差?

人工智能 卷积神经网络 训练 准确性 辍学 测试
2021-10-18 01:29:03

我正在尝试使用 ADAM 优化器、dropout 和权重衰减来训练 CNN 回归模型。

我的测试准确度优于训练准确度。但是,据我所知,通常训练精度优于测试精度。

所以我想知道这是怎么发生的。

我的图表

4个回答

您在训练期间使用 dropout 来减少过度拟合,但这会降低训练的准确性。测试时不会使用dropout,因此准确率会更高。

如果您使用 dropout,这是正常行为。

我将在这里添加所有好的答案。

就像我之前在评论中所说的那样,这还不错(前提是您正确拆分了数据)。

其他原因可能是:

  • 高辍学率或过度的数据扩充可能是原因之一。这可能会导致训练准确度看起来很低,而实际上模型实际上正在学习。你问怎么这样?正则化机制,例如 Dropout 和 L1/L2 权重正则化,在测试时被关闭。回想一下,您在训练集上看到的每个分数都是在“不同”的权重集(即不同的网络)上计算的。因此,您看到的准确性是您的网络在确定您现在正在测试集上测试的网络之前尝试过的所有网络的准确性。这里的原因是,与您现在用于在测试集上测试的最后一个网络相比,其他网络非常“糟糕”。如果这是你的情况,
  • 另一个可能的原因可能是您的测试集与训练集相比不同且更简单。也就是说:您的数据拆分可能使您的测试集比训练集更简单,因此您的网络在测试集上的表现似乎比在训练集上的表现要好得多。如果是这种情况,那么干得好,你已经为自己建立了一个非常好的模型,无需强调,但要小心,因为这样“糟糕”的数据拆分,未来你可能不会那么幸运:)。
  • 确保您正在进行正确的预处理。
  • 因此,您的测试集可能非常小,您在其上看到的高精度并不表示如果您有更大的测试集,您会看到的真实准确度。如果是这种情况,您可能需要收集更多测试数据并再次测试您的模型。
  • 另一个原因可能是您的训练集很小,并且您看到的高训练错误不是“真实的”。这就提出了一个问题,你的训练集有多大呢?
  • 引用Keras 文档

    训练损失是每批训练数据损失的平均值。因为您的模型会随着时间而变化,所以一个时期的第一批损失通常高于最后一批。另一方面,一个 epoch 的测试损失是使用模型计算的,因为它是在 epoch 结束时,导致较低的损失。

  • 最后,您可能会发现这个github postenter 链接描述在这里很有用。

如果您正在使用数据增强进行训练,那么除了 dropout(正如@demento 已经解释的那样),这是一种预期的行为。

此外,这实际上取决于您的测试数据分布的均匀程度及其大小。如果与训练数据集相比,您的测试数据集相对较小,那么它可能是预期的输出。