You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unet二分类分割训练中Dice与交叉熵组合损失为负问题咨询

损失为负的直接原因

属于代码逻辑错误,和数据归一化、网络结构无关,你的组合损失计算公式符号写反了:

  • 你定义的dice_loss()返回值是1-dice系数,属于常规需要最小化的正损失值(范围0~1)
  • 组合损失的正确逻辑是加权求和两个需要最小化的损失,但你的代码里错误使用了减号:
# 错误写法
combo_loss = (alpha * cross_entropy) - ((1 - alpha) * dice)
# 正确写法
combo_loss = (alpha * cross_entropy) + ((1 - alpha) * dice)

当dice损失的加权值大于交叉熵的加权值时,计算结果自然为负,和你观测到的训练日志完全匹配:你当前dice_coef=0.41,对应dice_loss=1-0.41=0.59,只要交叉熵数值小于0.59,0.5*交叉熵 - 0.5*0.59就会得到负值。

其他需要修正的潜在问题
  • 二分类场景下你输出的是单通道(num_class-1=1),不需要给交叉熵设置两维的beta_weight,会出现维度不匹配的广播错误,单通道类别加权直接在交叉熵公式里乘系数即可:
# 错误的二分类加权写法
beta_weight = np.array([beta, 1-beta])
cross_entropy = beta_weight * cross_entropy
# 正确的二分类加权写法
cross_entropy = - beta * y_true * K.log(y_pred) - (1-beta) * (1-y_true) * K.log(1-y_pred)

你当前的交叉熵基础公式逻辑正确,但后续乘两维权重的逻辑不适配单通道输出,会导致加权失效甚至计算异常。

修正以上问题后损失会回到正值,训练收敛也会恢复正常。

内容的提问来源于stack exchange,提问作者zorro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:06:07