python - 自定义损失函数不等于用于训练模型的损失函数
问题描述
这是我的第一篇文章,所以我将尝试详细说明所有相关信息。如果有什么遗漏请告诉我!
我目前正在尝试为灰度图像上的图像分割创建 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% 并且可见看起来不正确。
任何人都可以解释这种损失是如何计算的,以及为什么它不符合我的预期吗?
我在这里阅读了类似的帖子,但找不到任何有用的东西。
如果这很明显,请告诉我下一步要研究什么或进一步调查的资源的任何建议!先感谢您
解决方案
推荐阅读
- if-statement - Google App Script IF 函数仅检查一行,并将结果应用于所有行
- maven - Jenkins 构建失败并显示“由于 process.env.CI = true 将警告视为错误”
- json - Azure 消息路由:JSON 消息格式错误
- android - 使用 FileProvider 从图库中拍照
- java - 修改 SQLite 搜索参数以从一个单词返回完整字符串而不是特定顺序
- performance - 经典的 asp 站点在 IIS 服务器 10 上运行非常缓慢
- tsql - 获得添加到起始值的金额的公式,因此添加的金额将 = 新总数的 5%
- gitlab - Gitlab API 按主题过滤项目(项目标签)
- azure - 如何仅将 nginx 入口控制器部署到用户节点池
- google-sheets - 当单元格相等时执行数学运算