如何理解Keras模型拟合中的损失、验证损失、准确率和验证准确率

45

我是Keras的新手,对于如何理解我的模型结果有些疑问。这是我的结果:(为了方便起见,我只粘贴了每个epoch后的损失、准确率、验证损失和验证准确率)

在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. 两个损失值(loss和val_loss)都在减小,而两个准确度值(acc和val_acc)则在增加。这表明模型训练得很好。

  2. val_acc 是衡量模型预测结果的好坏的指标。在我的情况下,经过6次 epoch 后,模型已经训练得相当不错了,后续训练可能没有必要。

我的问题是:

  1. 训练集上的准确度 acc 总是比 val_acc(验证集上的准确度)小很多,这正常吗?为什么会发生这种情况?在我看来,acc 应该通常与 val_acc 相似或更好。

  2. 经过20轮 epoch 后,acc 仍在增加。那么我应该使用更多的 epoch 并在 acc 停止增长时停止吗?还是应该在 val_acc 不再增长时停止,而不管 acc 的趋势如何?

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

谢谢!

2个回答

34

回答你的问题:

  1. 正如官方Keras FAQ所述:

训练损失是每个训练数据批次中损失的平均值。由于您的模型随时间而改变,因此一个epoch中前几批次的损失通常比后面的批次要高。另一方面,一个epoch的测试损失是使用该epoch结束时的模型计算的,结果是更低的损失。

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

  2. 您的模型似乎取得了非常好的结果。继续保持好工作。


我理解什么是损失,但这个数字实际上代表什么呢?它是某个百分比吗?例如0.5的损失,那实际上意味着什么?损失与数字0.5有什么关系? - SuperHanz98

26
什么是lossval_loss
在深度学习中,loss是神经网络试图最小化的值:它是真实值和预测之间的距离。为了最小化这个距离,神经网络通过调整权重和偏差来进行学习,以减少loss
例如,在回归任务中,您有一个连续的目标,例如身高。您想要最小化的是您的预测和实际身高之间的差异。您可以使用mean_absolute_error作为损失,以便神经网络知道它需要最小化这个值。
在分类任务中,情况会更加复杂,但非常相似。预测的类别基于概率。因此,损失也基于概率。在分类中,神经网络将最小化分配低概率给实际类别的可能性。损失通常是categorical_crossentropylossval_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来公平地表示模型性能,因为良好的神经网络最终将完全适合训练数据,但在未看到的数据上表现不佳。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接