我使用Keras生物医学图像分割来分割大脑神经元。我使用model.evaluate()
,它给出的Dice系数为0.916。然而,当我使用model.predict()
后,通过计算Dice系数循环预测图像时,Dice系数为0.82。这两个值为什么不同?
我使用Keras生物医学图像分割来分割大脑神经元。我使用model.evaluate()
,它给出的Dice系数为0.916。然而,当我使用model.predict()
后,通过计算Dice系数循环预测图像时,Dice系数为0.82。这两个值为什么不同?
model.evaluate
函数会为给定的输入预测输出,然后计算在model.compile
中指定的度量函数,基于y_true
和y_pred
,并将计算出的度量值作为输出返回。
model.predict
仅返回y_pred
因此,如果您使用model.predict
,然后自行计算度量值,则计算出的度量值应与model.evaluate
相同
例如,在评估基于RNN / LSTM的模型时,需要将输出作为下一个时间步骤的输入,因此您应该使用model.predict
而不是model.evaluate
Keras
中的每个度量指标都是按照以下方式评估的:
k
个批次后)等于计算出的这 k
个批次的度量指标平均值。mse
、categorical_crossentropy
、mae
等) - 每个样例的损失值的平均值 - 具有这样一个属性,使得这种计算方法可以得到正确的结果。但在 Dice Coefficient 的情况下,跨所有批次的平均值并不等于在整个数据集上计算出的实际值,而由于 model.evaluate()
使用了这种计算方法,这就是问题的直接原因。keras.evaluate()
函数将为每个批次提供损失值。 keras.predict()
函数将为每个批次中的所有样本提供实际预测结果,对于所有批次也是如此。因此,即使使用相同的数据,由于损失函数的值几乎总是与预测值不同,所以仍然会存在差异。这是两个不同的概念。
model.predict()
返回模型的最终输出,也就是答案。而 model.evaluate()
返回的是损失函数。损失函数用于训练模型(通过反向传播),并且它不是答案。model.evaluate()
和model.predict()
之间的区别。
model.evaluate()
不仅提供了损失值,还提供了在model.compile
中定义的指定精度指标,就像 @javac 指出的那样。model.metrics_name
显示了evaluate()
的输出内容。 - MJimitater