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_true
和 y_pred
计算 model.compile
中指定的指标函数,并将计算出的指标值作为输出返回。
model.predict
只是返回 y_pred
因此,如果您使用model.predict
然后自己计算指标,计算出的指标值应该与model.evaluate
相同
例如,在评估基于 RNN/LSTM 的模型时,可以使用 model.predict
而不是 model.evaluate
,其中输出需要作为下一个时间步的输入提供
【讨论】:
【参考方案3】:问题在于Keras
中的每个指标都按以下方式评估:
-
为每个
batch
评估一个指标值。
当前的损失值(在k
批次之后等于您的指标在计算的k
批次中的平均值)。
最终结果是针对所有批次计算的所有损失的平均值。
大多数最流行的指标(如mse
、categorical_crossentropy
、mae
)等 - 作为每个示例的损失值的平均值 - 具有这样的评估最终得到正确结果的属性。但在骰子系数的情况下 - 所有批次的平均值不等于在整个数据集上计算的实际值,并且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完全不一样?白训练了吗?