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

我不明白在输出中应该使用哪个准确率来比较我的两个Keras模型,以确定哪个更好。

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

每个epoch都有不同的acc和val acc。我如何知道整个模型的acc或val acc?我是否应该平均所有epoch的acc或val acc来找到整个模型的acc或val acc?

模型1输出

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

模型2输出

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

回答:

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

如果你想估计你的模型对新数据的泛化能力(这可能是你想要做的),那么你应该查看验证准确率,因为验证集只包含模型在训练过程中从未见过的数据,因此模型无法简单地记住这些数据。

如果你的训练数据准确率(“acc”)持续提高,而你的验证数据准确率(“val_acc”)却变差,你很可能遇到了过拟合的情况,即你的模型开始只是简单地记住数据。

每个epoch都有不同的acc和val acc。我如何知道整个模型的acc或val acc?我是否应该平均所有epoch的acc或val acc来找到整个模型的acc或val acc?

每个epoch是对所有数据的一次训练运行。在这个过程中,根据你的损失函数调整模型的参数。结果是一组参数,这些参数具有一定的对新数据的泛化能力。这种能力通过验证准确率反映出来。因此,每个epoch都可以看作是它自己的模型,如果继续训练,可能会变得更好或更差。是否变好或变差取决于验证准确率的变化(变好=验证准确率增加)。因此,选择具有最高验证准确率的epoch的模型。不要平均不同epoch的准确率,这样做没有多大意义。你可以使用Keras的回调函数ModelCheckpoint来自动保存具有最高验证准确率的模型(参见回调函数文档)。

模型1的最高准确率是0.7737,模型2的最高准确率是0.7572。因此,你应该认为模型1(在第3个epoch)更好。不过,0.7737可能是随机的异常值。

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注