Keras 中同一数据集的 fit() 和 evaluate() 的不同精度

Hir*_*iro 6 python keras

我编写 Keras 代码来训练 GoogleNet。然而,fit() 得到的准确率是 100%,而用同样的训练数据集 evaluate() ,准确率只有 25%,差距如此之大!此外,与 fit() 不同,evaluate() 的准确率不会因训练次数而提高,这意味着它几乎保持在 25%。

有谁知道这种情况出了什么问题吗?

# Training Dataset and labels r given. Here load GoogleNet model
from keras.models import load_model
model = load_model('FT_InceptionV3.h5')
# Training Phase
model.fit(x=X_train, 
              y=y_train, 
              batch_size=5, 
              epochs=20, 
              validation_split=0,
              #callbacks=[tensorboard]
             )

#Testing Phase
train_loss , train_acc=model.evaluate(X_train, y_train, verbose=1)
print("Train loss=",train_loss,"Train accuracy",train_acc)
Run Code Online (Sandbox Code Playgroud)

训练结果

测试结果

Jus*_*rds 4

在深入研究 Keras 问题后,我发现了这一点。

这样做的原因是,当您使用 fit 时,每批训练数据的权重都会更新。fit方法返回的损失值不是最终模型损失的均值,而是每个批次上使用的所有略有不同的模型的损失的均值。

另一方面,当您用于评估时,会在整个数据集上使用相同的模型。该模型实际上甚至没有出现在拟合方法的损失中,因为即使在最后一批训练中,计算出的损失也用于更新模型的权重。

总而言之,拟合和评估有两种完全不同的行为。

参考:-

  1. Keras_issues_thread
  2. Keras_官方_文档