Keras模型中,model.evaluate()和model.predict()有什么区别?

64

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

4个回答

69

model.evaluate函数会为给定的输入预测输出,然后计算在model.compile中指定的度量函数,基于y_truey_pred,并将计算出的度量值作为输出返回。

model.predict仅返回y_pred

因此,如果您使用model.predict,然后自行计算度量值,则计算出的度量值应与model.evaluate相同

例如,在评估基于RNN / LSTM的模型时,需要将输出作为下一个时间步骤的输入,因此您应该使用model.predict而不是model.evaluate


25
问题在于,Keras 中的每个度量指标都是按照以下方式评估的:
  1. 对于每个批次,会计算一个度量指标值。
  2. 当前损失值(在计算了 k 个批次后)等于计算出的这 k 个批次的度量指标平均值。
  3. 最终结果是所有批次上计算出的损失值的平均值。
大多数流行的度量指标(如 msecategorical_crossentropymae 等) - 每个样例的损失值的平均值 - 具有这样一个属性,使得这种计算方法可以得到正确的结果。但在 Dice Coefficient 的情况下,跨所有批次的平均值并不等于在整个数据集上计算出的实际值,而由于 model.evaluate() 使用了这种计算方法,这就是问题的直接原因。

21

keras.evaluate() 函数将为每个批次提供损失值。 keras.predict()函数将为每个批次中的所有样本提供实际预测结果,对于所有批次也是如此。因此,即使使用相同的数据,由于损失函数的值几乎总是与预测值不同,所以仍然会存在差异。这是两个不同的概念。


5
确切地说,keras.evaluate 不是衡量分类器在实际世界中精度的可靠方式。人们应该有自己的代码来计算这个指标。 - StatguyUser
2
但是,model.evaluate() 不仅提供了损失值,还提供了在 model.compile 中定义的指定精度指标,就像 @javac 指出的那样。model.metrics_name 显示了 evaluate() 的输出内容。 - MJimitater

13
这篇文章是关于正则化的。 model.predict() 返回模型的最终输出,也就是答案。而 model.evaluate() 返回的是损失函数。损失函数用于训练模型(通过反向传播),并且它不是答案。
ML Tokyo视频可以帮助理解model.evaluate()model.predict()之间的区别。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接