我是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
以下是我的理解:
2. val_acc衡量模型预测的好坏程度。所以对于我的情况来说,看起来这个模型在6个epoches之后训练得很好,并且没有必要进行其余的训练。
我的问题是:
acc(训练集上的acc)总是比val_acc小,实际上要小得多。这是正常的吗?为什么会这样?在我看来,acc通常应该比val_acc更好。
在20个epoches之后,acc仍在增加。那么我应该使用更多的epoches并在acc停止增加时停止?或者我应该停止val_acc停止增加的地方,不考虑acc的交易?
我的结果还有其他难度吗?
谢谢!
答案 0 :(得分:14)
回答你的问题:
培训损失是每批培训数据的平均损失。因为您的模型随着时间的推移而变化,所以第一批时期的损失通常高于最后一批。另一方面,时间的测试损失是使用模型计算的,因为它在时期结束时,导致较低的损失。
当val_acc停止增加时,应停止训练,否则您的模型可能会过度使用。您可以使用Earlystopping回调来停止训练。
您的模型似乎取得了非常好的效果。保持良好的工作。
答案 1 :(得分:2)
loss
和val_loss
?在深度学习中,损失是神经网络试图最小化的价值。这就是神经网络学习的方式,即通过调整权重和偏差来减少损失。
例如,在回归任务中,您有一个连续的目标,例如身高。您要最小化的是预测值与实际高度之间的差异。您可以将mean_absolute_error
用作损失,以便神经网络知道将其最小化的必要条件。
在分类中,它稍微复杂一点,但非常相似。预测的类别基于概率。因此,损失也基于概率。在分类中,神经网络将为实际类别分配低概率的可能性降至最低。损失通常为categorical_crossentropy
。
loss
和val_loss
有所不同,因为前者应用于火车,而后者应用于测试。这样,后者很好地表明了模型如何处理看不见的数据。您可以使用validation_data=[x_test, y_test]
或validation_split=0.5
获得验证集。
最好依靠val_loss
来防止overfitting。 过度拟合是指模型过于紧密地拟合训练数据,而loss
持续下降而val_loss
则陈旧或增加。
在Keras中,当EarlyStopping
停止减小时,您可以使用val_loss
停止训练。阅读here。
在此处详细了解深度学习损失:Loss and Loss Functions for Training Deep Learning Neural Networks。
acc
和val_acc
?准确度是一个指标,仅用于分类。它给出了正确分类的实例的百分比。
再次,acc
在训练数据上,而val_acc
在验证数据上。最好依靠val_acc
来公平地表示模型性能,因为良好的神经网络最终将训练数据拟合为100%,但在看不见的数据上表现较差。