Keras双输出模型BinaryCrossentropy损失为负问题排查
问题原因
你的二分类任务出现负损失的核心原因是分类输出层配置和损失函数参数不匹配:
- 从模型结构可以看到,名为
amd的二分类输出头是Dense(1),没有指定激活函数,默认使用linear激活,输出值范围是全体实数(-∞, +∞),并非二分类交叉熵要求的[0,1]区间概率值。 - 你调用
tf.keras.losses.BinaryCrossentropy()时没有设置from_logits=True,Keras会默认传入的预测值已经是经过sigmoid映射的概率,直接对无界的线性输出做交叉熵计算。当输出值小于0时,log(1-p)的计算结果为正,带负号后就会得到负的损失值,和你日志中amd_loss持续下降变负的现象完全吻合。
日志中amd_auc始终为0、amd_accuracy长期卡在0.3左右(和数据集正样本占比一致,说明模型塌缩到固定输出,没有正常学习分类任务),也是损失计算错误导致的典型现象。
修复方案
两种方案二选一即可,第二种数值稳定性更高,更推荐使用:
- 修改输出层,添加sigmoid激活,保持损失函数写法不变:
# 把原来的amd层改成带sigmoid激活的版本 amd = Dense(1, activation='sigmoid') - 保持输出层为线性激活,修改损失函数声明,开启
from_logits=True:loss = { 'elicat': 'mse', 'amd': tf.keras.losses.BinaryCrossentropy(from_logits=True) }
补充说明
你之前排查标签范围在[0,1]的思路是对的,但忽略了预测值范围的合法性问题:二分类交叉熵要求预测值必须是合法概率(或传入未激活的logits同时开启from_logits参数,让框架内部自动做稳定的sigmoid映射和损失计算)。修复后你会看到amd_loss回到非负区间,AUC、准确率指标也会开始正常更新。
内容的提问来源于stack exchange,提问作者vernal123
相关产品推荐
相关产品推荐

