首页 > 解决方案 > Keras:为什么'accuracy'比'val_acc'高?

问题描述

我已经编译了一个模型,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。我没有为它提供测试集,所以我想知道它测试的是什么。

标签: machine-learningkerasdeep-learning

解决方案


在训练期间,样本再次被分成 2 个内部子集。一个用于实际训练,另一个用于每个 epoch 之后的验证。拆分的比率可以通过参数“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”以及最终的“准确度”更接近彼此


推荐阅读