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



我是Keras的新手,对如何理解我的模型结果有一些问题。这是我的结果:(为了你的方便,我只在每个历元后粘贴损失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

以下是我的理解:

  1. 两种损失(损失和val_loss)都在减少,两种acc(acc和val_acc)都在增加。因此,这表明建模是以一种良好的方式进行训练的。

  2. val_acc是衡量模型预测效果的指标。因此,在我的情况下,看起来模型在6个时期后训练得很好,其余的训练是不必要的。

我的问题是:

  1. acc(训练集上的acc)总是比val_acc小,实际上要小得多。这正常吗?为什么会发生这种情况?在我看来,acc通常应该类似于比val_acc更好。

  2. 在经历了20个时代之后,acc仍在增加。那么,我应该使用更多的历元,并在acc停止增加时停止吗?或者我应该停止val_acc停止增加的地方,不管acc的趋势如何?

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

谢谢!

回答您的问题:

  1. 如官方keras常见问题解答所述

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

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

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

  1. 什么是lossval_loss

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

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

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

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

最好依靠val_loss来防止过拟合过度拟合是指模型与训练数据拟合得过于紧密,并且lossval_loss过时或增加时不断减少。

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

点击此处阅读更多关于深度学习损失的信息:用于训练深度学习神经网络的损失和损失函数

  1. 什么是accval_acc

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

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

最新更新