如何解决model.evaluate对于同一度量返回不同的值,具体取决于是以损失还是度量形式返回
我像这样编译并训练了一个模型:
model.compile(optimizer=opt,loss=pixelwise_weighted_binary_crossentropy,metrics=[pixelwise_weighted_binary_crossentropy,dice_coef,dice_loss])
现在,在评估期间,运行时我得到的loss_weighted_cross_entropy_value_1
和weighted_cross_entropy_value_2
的值不同:
(loss_weighted_cross_entropy_value_1,weighted_cross_entropy_value_2,dice_value,dice_loss_value) = model.evaluate(data_generator)
在这里,weighted_cross_entropy_value_2
返回我期望的值(与在验证数据集上运行时的训练期间相同的值),但是loss_weighted_cross_entropy_value_1
似乎在该值附近随机波动,具体取决于批量大小。
如果我不得不猜测,似乎loss_weighted_cross_entropy_value_1
仅是最后一批评估数据的值。 weighted_cross_entropy_value_2
是所有批次评估数据的平均值。
这是正确的还是这里发生了什么?
修改:
我现在通过分别从生成器中获取每个批次并将它们作为numpy数组提供给model.evaluate(...)
来分别运行每个批次的评估(请参见下面的代码)。在这种情况下,对loss_weighted_cross_entropy_val_1
和weighted_cross_entropy_val_2
的批处理结果求平均值会得到相同的结果:
Averaged loss_weighted_cross_entropy_val_1 - per-sample pass: 0.08109399276593375; std: 0.005511607824946092
Averaged weighted_cross_entropy_val_2 - per-sample pass: 0.08109399271862848; std: 0.005511607193872294
我认为这进一步说明了我的理解。
代码:
nr_of_samples = len(data_generator)
result = nr_of_samples * [None]
loss_weighted_cross_entropy_val_1 = np.zeros(nr_of_samples)
weighted_cross_entropy_val_2 = np.zeros(nr_of_samples)
dice_val = np.zeros(nr_of_samples)
dice_loss_val = np.zeros(nr_of_samples)
for index,sample in enumerate(data_generator):
image = sample[0]
mask_weight = sample[1]
(loss_weighted_cross_entropy_val_1[index],weighted_cross_entropy_val_2[index],dice_val[index],dice_loss_val[index]) = model.evaluate(image,mask_weight)
print(f"Sample {index}/{nr_of_samples}")
解决方法
如果您使用与损耗和度量相同的功能,通常由于floating point precision errors
而导致的结果会有细微的差别。
请参阅此SO Answer,其中对此情况进行了详细说明。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。