如何判断哪个Keras模型更好?

44

我不知道要使用哪个输出准确率来比较我的两个Keras模型,以确定哪一个更好。

是使用“acc”(来自训练数据?)还是“val acc”(来自验证数据?)呢?

每个时代都有不同的acc和val acc。我如何知道模型的整体acc或val acc?我需要平均所有时代的accs或val accs来找到模型的整体acc或val acc吗?

模型1输出

Train on 970 samples, validate on 243 samples
Epoch 1/20
0s - loss: 0.1708 - acc: 0.7990 - val_loss: 0.2143 - val_acc: 0.7325
Epoch 2/20
0s - loss: 0.1633 - acc: 0.8021 - val_loss: 0.2295 - val_acc: 0.7325
Epoch 3/20
0s - loss: 0.1657 - acc: 0.7938 - val_loss: 0.2243 - val_acc: 0.7737
Epoch 4/20
0s - loss: 0.1847 - acc: 0.7969 - val_loss: 0.2253 - val_acc: 0.7490
Epoch 5/20
0s - loss: 0.1771 - acc: 0.8062 - val_loss: 0.2402 - val_acc: 0.7407
Epoch 6/20
0s - loss: 0.1789 - acc: 0.8021 - val_loss: 0.2431 - val_acc: 0.7407
Epoch 7/20
0s - loss: 0.1789 - acc: 0.8031 - val_loss: 0.2227 - val_acc: 0.7778
Epoch 8/20
0s - loss: 0.1810 - acc: 0.8010 - val_loss: 0.2438 - val_acc: 0.7449
Epoch 9/20
0s - loss: 0.1711 - acc: 0.8134 - val_loss: 0.2365 - val_acc: 0.7490
Epoch 10/20
0s - loss: 0.1852 - acc: 0.7959 - val_loss: 0.2423 - val_acc: 0.7449
Epoch 11/20
0s - loss: 0.1889 - acc: 0.7866 - val_loss: 0.2523 - val_acc: 0.7366
Epoch 12/20
0s - loss: 0.1838 - acc: 0.8021 - val_loss: 0.2563 - val_acc: 0.7407
Epoch 13/20
0s - loss: 0.1835 - acc: 0.8041 - val_loss: 0.2560 - val_acc: 0.7325
Epoch 14/20
0s - loss: 0.1868 - acc: 0.8031 - val_loss: 0.2573 - val_acc: 0.7407
Epoch 15/20
0s - loss: 0.1829 - acc: 0.8072 - val_loss: 0.2581 - val_acc: 0.7407
Epoch 16/20
0s - loss: 0.1878 - acc: 0.8062 - val_loss: 0.2589 - val_acc: 0.7407
Epoch 17/20
0s - loss: 0.1833 - acc: 0.8072 - val_loss: 0.2613 - val_acc: 0.7366
Epoch 18/20
0s - loss: 0.1837 - acc: 0.8113 - val_loss: 0.2605 - val_acc: 0.7325
Epoch 19/20
0s - loss: 0.1906 - acc: 0.8010 - val_loss: 0.2555 - val_acc: 0.7407
Epoch 20/20
0s - loss: 0.1884 - acc: 0.8062 - val_loss: 0.2542 - val_acc: 0.7449

模型2输出

Train on 970 samples, validate on 243 samples
Epoch 1/20
0s - loss: 0.1735 - acc: 0.7876 - val_loss: 0.2386 - val_acc: 0.6667
Epoch 2/20
0s - loss: 0.1733 - acc: 0.7825 - val_loss: 0.1894 - val_acc: 0.7449
Epoch 3/20
0s - loss: 0.1781 - acc: 0.7856 - val_loss: 0.2028 - val_acc: 0.7407
Epoch 4/20
0s - loss: 0.1717 - acc: 0.8021 - val_loss: 0.2545 - val_acc: 0.7119
Epoch 5/20
0s - loss: 0.1757 - acc: 0.8052 - val_loss: 0.2252 - val_acc: 0.7202
Epoch 6/20
0s - loss: 0.1776 - acc: 0.8093 - val_loss: 0.2449 - val_acc: 0.7490
Epoch 7/20
0s - loss: 0.1833 - acc: 0.7897 - val_loss: 0.2272 - val_acc: 0.7572
Epoch 8/20
0s - loss: 0.1827 - acc: 0.7928 - val_loss: 0.2376 - val_acc: 0.7531
Epoch 9/20
0s - loss: 0.1795 - acc: 0.8062 - val_loss: 0.2445 - val_acc: 0.7490
Epoch 10/20
0s - loss: 0.1746 - acc: 0.8103 - val_loss: 0.2491 - val_acc: 0.7449
Epoch 11/20
0s - loss: 0.1831 - acc: 0.8082 - val_loss: 0.2477 - val_acc: 0.7449
Epoch 12/20
0s - loss: 0.1831 - acc: 0.8113 - val_loss: 0.2496 - val_acc: 0.7490
Epoch 13/20
0s - loss: 0.1920 - acc: 0.8000 - val_loss: 0.2459 - val_acc: 0.7449
Epoch 14/20
0s - loss: 0.1945 - acc: 0.7928 - val_loss: 0.2446 - val_acc: 0.7490
Epoch 15/20
0s - loss: 0.1852 - acc: 0.7990 - val_loss: 0.2459 - val_acc: 0.7449
Epoch 16/20
0s - loss: 0.1800 - acc: 0.8062 - val_loss: 0.2495 - val_acc: 0.7449
Epoch 17/20
0s - loss: 0.1891 - acc: 0.8000 - val_loss: 0.2469 - val_acc: 0.7449
Epoch 18/20
0s - loss: 0.1891 - acc: 0.8041 - val_loss: 0.2467 - val_acc: 0.7531
Epoch 19/20
0s - loss: 0.1853 - acc: 0.8072 - val_loss: 0.2511 - val_acc: 0.7449
Epoch 20/20
0s - loss: 0.1905 - acc: 0.8062 - val_loss: 0.2460 - val_acc: 0.7531
2个回答

64
如果您想估计模型推广到新数据的能力(这可能是您想要做的),那么您需要查看验证准确性,因为验证拆分仅包含模型在训练期间从未见过的数据,因此不能仅仅记忆。 如果您的训练数据准确性(“acc”)不断提高,而验证数据准确性(“val_acc”)变差,则您很可能处于 过度拟合情况,即您的模型开始基本上只是记忆数据。
对于每个时期,都有不同的 acc 和 val acc。我如何知道整个模型的 acc 或 val acc? 我需要平均所有时期的 acc 或 val acc 来找到整个模型的 acc 或 val acc 吗?

每个时期都是对您的所有数据进行训练运行。在此过程中,根据您的损失函数调整模型的参数。结果是一组具有某种泛化到新数据的能力的参数。这种能力通过验证准确性来反映。因此,请将每个时期视为其自己的模型,如果再进行一次训练,则可以变得更好或更差。它是否变得更好或更差取决于验证准确性的变化(更好=验证准确性增加)。因此,请选择具有最高验证准确性的时期的模型。不要对不同时期的准确性进行平均,那样没有多大意义。您可以使用Keras回调ModelCheckpoint来自动保存具有最高验证准确性的模型(请参见callbacks documentation)。

模型1中的最高准确度为0.7737,而模型2中的最高准确度为0.7572。因此,您应该将模型1(第3个时期)视为更好。尽管可能0.7737只是一个随机异常值。


3
模型检查点会在每个 epoch 结束后保存模型权重,如果验证损失减少,则会保存。这是否意味着模型的验证精度更高?从数字上看,有时候尽管验证损失减少了,但验证精度却没有提高。为什么会出现这种情况? - pr338
4
假设你需要训练一个模型,使其对于四个示例都能正确预测标签为 1。但是,现在该模型预测了四次值为 0.51(每个值都高于阈值 0.5,因此根据准确度衡量被视为预测正确)。在下一个时期,它将这些值更改为 0.49、0.49、0.49 和 0.95。由于从 0.51 到 0.95 的巨大变化,损失函数的值将显着提高,但准确性会降低,因为其中三个值现在低于 0.5 的阈值,因此被视为标签 0。 - aleju
@aleju 只是想知道,增加 epochs 的数量会让模型变得更好吗?我仍然非常困惑 epochs 的数量如何影响模型的准确性。 - user10024395
1
只需使用“ModelCheckpoint”回调函数,每当验证准确性提高时,就会自动将当前模型的权重保存到文件中。然后在测试或生产使用期间,重新构建和编译相同的架构(层,激活,...),并使用“model.load_weights(filename)”加载权重(在调用“model.predict(...)”或类似内容之前)。 - aleju
1
为了保存最佳模型,定义 cb = [ModelCheckpoint("weights.h5", save_best_only=True, save_weights_only=True)] 并在训练时添加回调参数:model.fit(... callbacks=cb) - Lavi Avigdor
显示剩余4条评论

6
你需要关注减少val_loss或增加val_acc,但最终这并不太重要。这些差异都在随机/四舍五入误差范围内。
实际上,训练损失可能会因为过拟合而显著下降,因此你需要关注验证损失。
在你的情况下,你可以看到你的训练损失没有下降——这意味着每个时期后你都没有学到任何东西。看起来这个模型中没有什么可学习的,除了一些微不足道的线性适配或截止值。
此外,当学习无效或微不足道的线性内容时,你应该在训练和验证中获得类似的表现(微不足道的学习总是具有普适性)。在使用validation_split功能之前,你应该对数据进行洗牌。

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