首页 > 解决方案 > 自定义损失函数不等于用于训练模型的损失函数

问题描述

这是我的第一篇文章,所以我将尝试详细说明所有相关信息。如果有什么遗漏请告诉我!

我目前正在尝试为灰度图像上的图像分割创建 cnn(基于 unet)。

我创建了一个自定义函数来计算骰子损失和二元交叉熵损失,见下文。

def dice_BCE_coef_loss(y_true, y_pred):
    smooth = 1
    bce_weight = 0.5

    #y_true_f = tensorflow.math.reduce_sum(y_true)
    #y_pred_f = tensorflow.math.reduce_sum(y_pred)
    y_true_f = tensorflow.reshape(y_true, [-1])
    y_pred_f = tensorflow.reshape(y_pred, [-1])

    intersection  = tensorflow.math.reduce_sum(y_true_f * y_pred_f)
    union = tensorflow.math.reduce_sum(y_true_f + y_pred_f)
    dice_coef = (2*intersection + smooth) / (union + smooth)
    dice_loss = 1 - dice_coef

    BCE =  tensorflow.keras.losses.BinaryCrossentropy(from_logits=True)(y_true, y_pred)
    dice_BCE = tensorflow.math.reduce_mean(BCE * bce_weight + dice_loss * (1 - bce_weight))
    return dice_BCE

然后我将它作为损失添加到我的模型中。

model.compile(optimizer=tensorflow.keras.optimizers.Adam(lr=1e-3), 
              loss=dice_BCE_coef_loss, 
              metrics=['accuracy']
              )

当我手动计算 dice_BCE 时出现问题,损失值与训练期间的输出损失不同。为了确认这是否是整个数据集的正确值(我的手动检查是单个图像),我将数据集缩减为单个图像和蒙版,但它们仍然不匹配。

显示损失与我预期的 dice_BCE 损失的差异的图像(我希望在这种情况下允许图片)1

在几个 epoch 之后,这种损失始终保持在 0.48 左右,但从未真正从那里改善,有时您可以看到输出掩码非常接近(并且预期 dice_BCE 匹配)但它最终会发散,因为它似乎训练的损失可以以其他方式改进(但增加预期的 dice_loss)。

骰子损失(通过历元的损失值)也远低于通过函数计算时的损失。大约 0.001,即使预测的准确度约为 50% 并且可见看起来不正确。

任何人都可以解释这种损失是如何计算的,以及为什么它不符合我的预期吗?

我在这里阅读了类似的帖子,但找不到任何有用的东西。

如果这很明显,请告诉我下一步要研究什么或进一步调查的资源的任何建议!先感谢您

标签: pythonkerastensorflow2.0loss-function

解决方案


推荐阅读