Keras:训练和验证集上的 model.evaluate() 与上次训练时期后的 acc 和 val_acc 不同

Posted

技术标签:

【中文标题】Keras:训练和验证集上的 model.evaluate() 与上次训练时期后的 acc 和 val_acc 不同【英文标题】:Keras: model.evaluate() on training and val set differ from the acc and val_acc after last training epoch 【发布时间】:2020-03-25 20:33:21 【问题描述】:

在最后一个训练时期之后,我得到这个输出:

Epoch 100/100
89254/89254 - 24s - loss: 0.1935 - acc: 0.9281 - val_loss: 0.2182 - val_acc: 0.9219

但问题是,一旦我对训练数据和验证数据执行model.evaluate(),我会得到不同的结果:

Train accuracy: 0.929661
Validation accuracy: 0.921859

这有什么意义?尽管测试模式,为什么model.evaluate() 函数存在参数batch_size? https://keras.io/models/model/#evaluate 如果我已经批量训练了模型,是否还需要为测试模式定义批量大小?

【问题讨论】:

您的第二个问题在这里得到解答:***.com/questions/37911321/… 【参考方案1】:

当然,首先,在进度条上的训练集中产生的任何度量/损失都被计算为训练批次的运行平均值,其中权重由于梯度下降而变化。这意味着训练指标永远不会与使用model.evaluate() 计算的指标相匹配,因为在这种情况下,权重是恒定的,不会发生变化。

关于验证指标,它们确实匹配,只是keras 进度条只打印了四个有效数字,而您打印了更多。

关于批量大小,我已经评论说基本上已经回答了here。 Keras 使用批处理是因为您无法一次对整个数据集进行预测,这可能会占用太多内存

【讨论】:

以上是关于Keras:训练和验证集上的 model.evaluate() 与上次训练时期后的 acc 和 val_acc 不同的主要内容,如果未能解决你的问题,请参考以下文章

Keras,训练期间验证集上的 auc 与 sklearn auc 不匹配

Keras cifar10 示例验证和测试损失低于训练损失

使用 pytorch 训练和测试 CNN。有和没有 model.eval()

为啥在同一数据集上使用 tensorflow 和 keras 重新训练的 Inception V3 显示出不同的准确性?

Keras 函数模型验证准确率高,但预测不正确

pytorch踩坑之model.eval()和model.train()输出差距很大