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

Roc*_*cco 20 python machine-learning neural-network deep-learning keras

我是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
Run Code Online (Sandbox Code Playgroud)

以下是我的理解:

  1. 两次损失(损失和val_loss)都在下降,拖曳acc(acc和val_acc)正在增加.因此,这表明建模是以良好的方式进行的.

2. val_acc衡量模型预测的好坏程度.所以对于我的情况来说,看起来模型在6个epoches之后训练得很好,并且没有必要进行其余的训练.

我的问题是:

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

  2. 在20个epoches之后,acc仍在增加.那么我应该使用更多的epoches并在acc停止增加时停止?或者我应该停止val_acc停止增加的地方,无法调整acc的交易?

  3. 我的结果还有其他难度吗?

谢谢!

Ioa*_*ios 20

回答你的问题:

  1. 如官方keras FAQ所述

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

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

  2. 你的模型似乎取得了很好的效果.保持良好的工作.

  • 谢谢!我还有一个问题:我尝试了类似的模型并使用了更多的纪元。val_acc在10个纪元内收敛,因此在10个纪元后,该模型可能过拟合。但是这是我观察到的结果,但我不明白:时代18/50-损失:0.0182-acc:0.9970-val_loss:0.0876-val_acc:0.9828。时代19/50-损失:7.0839e-04-acc:0.0766-val_loss:1.1921e-07-val_acc:0.0269。在纪元19/50,损失和acc急剧下降,并且在接下来的所有纪元中,损失和acc值保持相同。这是由于过度拟合还是发生了什么? (2认同)

Nic*_*ais 13

  1. 什么是lossval_loss

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

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

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

lossval_loss不同,因为前者是施加到列车组,而后者的测试集。因此,后者很好地表明了模型如何处理看不见的数据。您可以使用validation_data=[x_test, y_test]或获取验证集validation_split=0.2

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

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

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

  1. 什么是accval_acc

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

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