【问题标题】:Different accuracy by fit() and evaluate() in Keras with the same dataset具有相同数据集的 Keras 中 fit() 和 evaluate() 的不同精度
【发布时间】:2019-03-11 21:31:50
【问题描述】:

我编写 Keras 的代码来训练 GoogleNet。然而,从 fit() 得到的准确率是 100%,但使用相同的训练数据集用于评估(),准确率仍然只有 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)

Training Result

Testing Result

【问题讨论】:

  • @Justice_Lords 看看模型是否过度拟合,他/她应该在测试或开发集中进行评估,事实并非如此。他/她正在检查培训阶段。我认为这行不通,但您可以尝试预测训练集并使用 scikit-learn 中的accurarcy_score,例如,看看评估函数是否有错误或其他问题。
  • 这可能会有所帮助(例如设置适当的种子等):machinelearningmastery.com/…
  • ConvNets 拒绝学习在大多数情况下是由于输入图像的缩放/预处理不当或优化器的 learning_rate 错误(例如 LR 太大或太小)。希望对您有所帮助。
  • @Justice_Lords 虽然它可能有过拟合,但如果使用相同的数据集 r,fit() 和 evaluate() 的准确度会不会相同?

标签: python keras


【解决方案1】:

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

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

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

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

参考:-

  1. Keras_issues_thread
  2. Keras_official_doc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-17
    • 2018-11-29
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多