如何理解 Keras 模型拟合中的 loss acc val_loss val_acc

Posted

技术标签:

【中文标题】如何理解 Keras 模型拟合中的 loss acc val_loss val_acc【英文标题】:How to understand loss acc val_loss val_acc in Keras model fitting 【发布时间】:2018-04-28 05:14:50 【问题描述】:

我是 Keras 的新手,对如何理解我的模型结果有一些疑问。这是我的结果:(为方便起见,我只在每个 epoch 之后粘贴 loss acc val_loss val_acc)

对 4160 个样本进行训练,对 1040 个样本进行验证,如下所示:

Epoch 1/20
4160/4160 - loss: 3.3455 - acc: 0.1560 - val_loss: 1.6047 - val_acc: 0.4721

Epoch 2/20
4160/4160 - loss: 1.7639 - acc: 0.4274 - val_loss: 0.7060 - val_acc: 0.8019

Epoch 3/20
4160/4160 - loss: 1.0887 - acc: 0.5978 - val_loss: 0.3707 - val_acc: 0.9087

Epoch 4/20
4160/4160 - loss: 0.7736 - acc: 0.7067 - val_loss: 0.2619 - val_acc: 0.9442

Epoch 5/20
4160/4160 - loss: 0.5784 - acc: 0.7690 - val_loss: 0.2058 - val_acc: 0.9433

Epoch 6/20
4160/4160 - loss: 0.5000 - acc: 0.8065 - val_loss: 0.1557 - val_acc: 0.9750

Epoch 7/20
4160/4160 - loss: 0.4179 - acc: 0.8296 - val_loss: 0.1523 - val_acc: 0.9606

Epoch 8/20
4160/4160 - loss: 0.3758 - acc: 0.8495 - val_loss: 0.1063 - val_acc: 0.9712

Epoch 9/20
4160/4160 - loss: 0.3202 - acc: 0.8740 - val_loss: 0.1019 - val_acc: 0.9798

Epoch 10/20
4160/4160 - loss: 0.3028 - acc: 0.8788 - val_loss: 0.1074 - val_acc: 0.9644

Epoch 11/20
4160/4160 - loss: 0.2696 - acc: 0.8923 - val_loss: 0.0581 - val_acc: 0.9856

Epoch 12/20
4160/4160 - loss: 0.2738 - acc: 0.8894 - val_loss: 0.0713 - val_acc: 0.9837

Epoch 13/20
4160/4160 - loss: 0.2609 - acc: 0.8913 - val_loss: 0.0679 - val_acc: 0.9740

Epoch 14/20
4160/4160 - loss: 0.2556 - acc: 0.9022 - val_loss: 0.0599 - val_acc: 0.9769

Epoch 15/20
4160/4160 - loss: 0.2384 - acc: 0.9053 - val_loss: 0.0560 - val_acc: 0.9846

Epoch 16/20
4160/4160 - loss: 0.2305 - acc: 0.9079 - val_loss: 0.0502 - val_acc: 0.9865

Epoch 17/20
4160/4160 - loss: 0.2145 - acc: 0.9185 - val_loss: 0.0461 - val_acc: 0.9913

Epoch 18/20
4160/4160 - loss: 0.2046 - acc: 0.9183 - val_loss: 0.0524 - val_acc: 0.9750

Epoch 19/20
4160/4160 - loss: 0.2055 - acc: 0.9120 - val_loss: 0.0440 - val_acc: 0.9885

Epoch 20/20
4160/4160 - loss: 0.1890 - acc: 0.9236 - val_loss: 0.0501 - val_acc: 0.9827

以下是我的理解:

    两个损失(loss 和 val_loss)都在减少,而 tow acc(acc 和 val_acc)在增加。因此,这表明模型经过了良好的训练。

    val_acc 衡量模型预测的好坏。所以对于我来说,看起来模型在 6 个 epoch 之后训练得很好,其余的训练是没有必要的。

我的问题是:

    acc(训练集上的 acc)总是比 val_acc 小,实际上要小得多。这是正常的吗?为什么会这样?在我看来,acc 通常应该比 val_acc 更好。

    经过 20 个 epoch,acc 仍在增加。那么我应该使用更多的时期并在 acc 停止增加时停止吗?或者我应该在 val_acc 停止增加的地方停下来,不管 acc 的趋势如何?

    对我的结果还有其他想法吗?

谢谢!

【问题讨论】:

【参考方案1】:

回答您的问题:

    如官方keras FAQ所述

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

    当 val_acc 停止增加时应该停止训练,否则你的模型可能会过度拟合。您可以使用 earlystopping 回调来停止训练。

    您的模型似乎取得了很好的效果。继续努力。

【讨论】:

@Rocco 请不要在 cmets 中提出此类后续问题(如有必要,您可以随时提出新问题)。如果答案解决了您的问题,请接受 - 请参阅 What should I do when someone answers my question? 所以我明白什么是损失,但这个数字实际上代表什么。它是某种东西的百分比吗?例如,损失 0.5,这实际上意味着什么?损失与这个数字 0.5 有什么关系?【参考方案2】:
    什么是lossval_loss

在深度学习中,损失是神经网络试图最小化的值:它是基本事实与预测之间的距离。为了最小化这个距离,神经网络学习通过以减少损失的方式调整权重和偏差。

例如,在回归任务中,您有一个连续的目标,例如高度。您想要最小化的是您的预测与实际高度之间的差异。您可以使用mean_absolute_error 作为损失,这样神经网络就知道这是它需要最小化的。

分类中,它有点复杂,但非常相似。预测类别基于概率。因此,损失也基于概率。在分类中,神经网络最小化了将低概率分配给实际类的可能性。损失通常是categorical_crossentropy

lossval_loss 不同,因为前者应用于训练集,而后者应用于测试集。因此,后者很好地表明了模型在看不见的数据上的表现。您可以使用validation_data=[x_test, y_test]validation_split=0.2 获取验证集。

最好依靠val_loss来防止overfitting。 过拟合是指模型过于接近训练数据,loss 不断减少,而val_loss 过时或增加。

在 Keras 中,当 val_loss 停止减少时,您可以使用 EarlyStopping 停止训练。阅读here。

在此处阅读有关深度学习损失的更多信息:Loss and Loss Functions for Training Deep Learning Neural Networks。

    什么是accval_acc

准确度是一个仅用于分类的指标。对于具有连续目标的任务来说,这是没有意义的。它给出了正确分类的实例的百分比。

再一次,acc 在训练数据上,val_acc 在验证数据上。最好依靠val_acc 来公平地表示模型性能,因为一个好的神经网络最终会以 100% 拟合训练数据,但在看不见的数据上表现不佳。

【讨论】:

以上是关于如何理解 Keras 模型拟合中的 loss acc val_loss val_acc的主要内容,如果未能解决你的问题,请参考以下文章

keras中accuracy是怎么算出来的,为啥loss下降,accuracy不变甚至减小

Keras 自定义loss函数 focal loss + triplet loss

Keras 多输入、多输出、多loss模型构建

keras训练cnn模型时loss为nan

如何在 keras 中拟合两个连接 LSTM 的模型?

一旦模型拟合,Keras 如何评估单个图像