Keras model.evaluate() 和 model.predict() 有啥区别?

Posted

技术标签:

【中文标题】Keras model.evaluate() 和 model.predict() 有啥区别?【英文标题】:What is the difference between Keras model.evaluate() and model.predict()?Keras model.evaluate() 和 model.predict() 有什么区别? 【发布时间】:2017-11-12 14:06:48 【问题描述】:

我使用 Keras 生物医学图像分割来分割大脑神经元。我使用了model.evaluate(),它给了我骰子系数:0.916。但是,当我使用model.predict(),然后通过计算Dice系数循环预测图像时,Dice系数为0.82。为什么这两个值不同?

【问题讨论】:

【参考方案1】:

这是关于正则化的。 model.predict() 返回模型的最终输出,即答案。而model.evaluate() 返回损失。损失用于训练模型(通过反向传播),它不是答案。

这个video of ML Tokyo应该有助于理解model.evaluate()model.predict()之间的区别。

【讨论】:

【参考方案2】:

model.evaluate 函数预测给定输入的输出,然后根据 y_truey_pred 计算 model.compile 中指定的指标函数,并将计算出的指标值作为输出返回。

model.predict 只是返回 y_pred

因此,如果您使用model.predict 然后自己计算指标,计算出的指标值应该与model.evaluate 相同

例如,在评估基于 RNN/LSTM 的模型时,可以使用 model.predict 而不是 model.evaluate,其中输出需要作为下一个时间步的输入提供

【讨论】:

【参考方案3】:

问题在于Keras 中的每个指标都按以下方式评估:

    为每个 batch 评估一个指标值。 当前的损失值(在k 批次之后等于您的指标在计算的k 批次中的平均值)。 最终结果是针对所有批次计算的所有损失的平均值。

大多数最流行的指标(如msecategorical_crossentropymae)等 - 作为每个示例的损失值的平均值 - 具有这样的评估最终得到正确结果的属性。但在骰子系数的情况下 - 所有批次的平均值不等于在整个数据集上计算的实际值,并且model.evaluate() 使用这种计算方式 - 这是您的问题的直接原因。

【讨论】:

【参考方案4】:

keras.evaluate() 函数将为您提供每批的损失值。 keras.predict() 函数将为您提供所有批次中所有样本的实际预测。因此,即使您使用相同的数据,也会存在差异,因为损失函数的值几乎总是与预测值不同。这是两个不同的东西。

【讨论】:

准确地说,keras.evaluate 并不是衡量分类器在现实世界中工作准确度的可靠方法。人们应该有自己的代码来计算。 但是model.evaluate() 不仅 给出了损失,还给出了model.compile 中定义的指定准确度指标,就像@javac 指出的那样。 model.metrics_name 显示 evaluate() 输出的内容

以上是关于Keras model.evaluate() 和 model.predict() 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

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

Keras:model.evaluate vs model.predict 多类 NLP 任务中的准确率差异

Keras model.evaluate_generator结果几乎是真实准确度的两倍?

keras训练完模型,为啥对训练集进行evaluate和训练时的loss完全不一样?白训练了吗?

从 Keras model.predict_generator 计算准确率

Tensorflow model.evaluate 给出的结果与从训练中获得的结果不同