Keras cifar10 示例验证和测试损失低于训练损失

Posted

技术标签:

【中文标题】Keras cifar10 示例验证和测试损失低于训练损失【英文标题】:Keras cifar10 example validation and test loss lower than training loss 【发布时间】:2017-08-10 06:14:51 【问题描述】:

我正在玩 Keras 的 cifar10 示例,您可以找到 here。我重新创建了模型(即,不是同一个文件,但其他一切都几乎相同),你可以找到它here。

模型是相同的,我在 50,000 张图像训练集上使用 0.2 次验证拆分训练模型 30 个 epoch。我无法理解我得到的结果。我的验证和测试损失比训练少(相反,训练准确度比验证和测试准确度低):

                      Loss       Accuracy
   Training          1.345          0.572
 Validation          1.184          0.596
       Test           1.19          0.596

看情节,我不确定为什么训练错误又开始如此严重地增加。我是否需要减少训练的 epoch 数量或可能实施提前停止?不同的模型架构会有所帮助吗?如果有,有什么好的建议?

谢谢。

【问题讨论】:

【参考方案1】:

这是一种罕见的现象,但时有发生。出现这种情况的原因有几个:

较小的数据集具有较小的内在方差,因此这意味着您的模型可以正确捕获数据内部的模式,并且训练误差更大,这仅仅是因为训练集的内部方差 大于验证集 简单的意外 - 这也可能发生 - 你的分裂适合这种行为。

【讨论】:

谢谢。 (1) CIFAR10 算不算小数据集?从情节上看,我似乎在 7 个 epoch 左右得到了不错的表现,但让我感到困惑的是训练误差不断增加。 (2) 我跑了很多次,得到了类似的结果,希望我没有那么不走运。【参考方案2】:

Marcin 的回答很好。高训练错误还有另外几个重要原因:

辍学。 Dropout 层在训练中“开启”,但在进行验证和测试时将“关闭”(跳过)。这是自动的,而且是设计使然。 Dropout 对训练误差有轻微的损害。这是可以预料的。尽管存在额外的训练挑战,Dropout 层实际上有助于深度神经网络进行正则化。大多数深度神经网络可能使用 dropout。

学习率太高。这就像把硬币扔进玻璃杯里。扔得太猛会跳出来。

【讨论】:

以上是关于Keras cifar10 示例验证和测试损失低于训练损失的主要内容,如果未能解决你的问题,请参考以下文章

Keras CIFAR-10分类 AlexNet篇

Keras CIFAR-10图像分类 GoogleNet 篇

Keras CIFAR-10图像分类 GoogleNet 篇

Keras CIFAR-10分类 LeNet-5篇

Keras CIFAR-10图像分类 AlexNet篇

Keras CIFAR-10分类 SVM 分类器篇