Keras:为什么“准确性”要比“ val_acc”高?

时间:2018-07-14 04:04:42

标签: machine-learning keras deep-learning

我用metrics=['accuracy']编译了一个模型,得到的值始终高于验证精度val_acc。例如:

Epoch 19/20
53/53 [==============================] - 280s - loss: 0.3931 - acc: 0.8238 - val_loss: 0.5002 - val_acc: 0.7757
Epoch 20/20
53/53 [==============================] - 278s - loss: 0.3957 - acc: 0.8255 - val_loss: 0.5009 - val_acc: 0.7754
accuracy: 0.790697674418604

任何人都知道两个值的计算方式不同吗?

更新

我使用的是Keras 2.0.8。我所说的“准确性”是指最后一行accuracy: 0.790697674418604。我没有为它提供测试集,所以我想知道它在什么测试上。

3 个答案:

答案 0 :(得分:3)

在训练过程中,样本再次被分为2个内部子集。一个用于实际训练,另一个用于每个时期之后的验证。拆分比例可以通过如下所示的参数“ validation_split”来控制(来自Keras的示例)

h = model.fit(X_train, Y_train, batch_size=200, epochs=50, verbose=2, validation_split=0.2)

现在,进入日志,“ acc”指的是受训内容的准确性。 'val_acc'是指验证集。请注意,val_acc指的是训练期间未向网络显示的一组样本,因此是指模型在训练集中以外的情况下通常能工作多少。

通常,验证精度会低于精度。但理想情况下,您应努力将这些价值观保持在同一水平。如果验证准确性远低于准确性,那么您肯定会过拟合(如上例中所示)-准确性为84,验证准确性为77。

编辑: 关于日志最后一行中的“准确性”,即在所有时期都针对测试数据集运行之后网络的准确性。通常比精度更接近“ val_acc”(例如在上面的情况下是79)。这只是意味着测试数据中的样本比最后一次运行中的验证数据中的样本更为紧密(请记住,这两个集合均未用于训练)

无论如何,我认为您应该进行调整以确保“ acc”和“ val_acc”以及最终的“准确性”彼此之间更接近

答案 1 :(得分:0)

模型正在优化的实际指标是损耗,因此在优化过程中,您应该跟踪损耗并监视其与val_loss相比的改进。 在val_loss比损失更严重的时候,您过度拟合,需要采取适当的措施。

准确性度量在很大程度上取决于您的数据,因为它计算正确分类的百分比。数据拆分中的类不平衡可能导致不同的准确性度量。

答案 2 :(得分:0)

在与您的训练集不同的数据集上计算验证准确性。验证准确性可能会由于多种原因而降低-如果训练集之间存在较大差异,我会研究不平衡的类,过度拟合,数据不足。您引用的准确性很可能是训练准确性。关于为什么要完全计算出训练准确性,您将输入的特征又输入到网络中,并使用随机权重初始化NN。您让NN找出/猜测标签,然后将其与实际标签进行比较。错误。计算猜测值与实际标签之间的差异,然后反向传播错误。您可以对所有样本/批次执行此操作。 Keras会自动处理所有这些问题,并输出有关培训进行方式的指标-通常是损失和样本/批次加总时的准确性。这就是您看到的准确性指标。