如何将Keras版Deeplabv3+多分类语义分割适配为医疗图像二分类任务
问题1:NUM_CLASSES参数修改是否正确
将NUM_CLASSES = 20改为NUM_CLASSES = 1是正确的。二分类语义分割采用单通道输出时,每个像素仅需输出1个值判断属于前景/背景,完全匹配医疗分割的二分类需求。
你设置NUM_CLASSES = 2出现logits与标签不匹配的报错,核心原因是参数配置和标签格式不兼容:如果要保留2通道输出,需要将标签转换为2通道的one-hot格式,同时损失函数继续使用SparseCategoricalCrossentropy,但二分类场景下单通道+二分类损失的配置计算效率更高,没必要额外开2通道。
问题2:BinaryCrossentropy损失为负数的修复
损失为负数是输出与标签的取值范围不匹配导致的,你需要做两处检查:
- 确认标签张量的取值仅为0和1:如果你的标注是原始的灰度png图,需要先将像素值大于0的所有标签统一转为1,禁止出现0~1之间的浮点值或大于1的整数,否则会导致损失计算异常。
- 确认模型最后一层的输出通道数和
NUM_CLASSES = 1保持一致,不要误保留原代码的20通道或错设为2通道。
问题3:最后一层激活函数的配置
不需要将激活函数更换为softmax,有两种可行的配置方案,推荐选择第一种:
- 方案1(训练数值稳定性更高):最后一层保持原代码的
keras.activations.linear,损失函数保持BinaryCrossentropy(from_logits=True),推理阶段给输出结果套一层sigmoid激活,再按阈值(通常设为0.5)做二值化即可。 - 方案2:最后一层激活更换为
keras.activations.sigmoid,损失函数设为BinaryCrossentropy(from_logits=False),该方案推理时不需要额外加激活,但训练过程的数值稳定性略低于方案1。
注意:softmax是多分类场景的激活函数,仅适配输出通道数≥2的分类场景,和你当前的单通道二分类配置不兼容,不要混用。
内容的提问来源于stack exchange,提问作者Tiz
相关产品推荐
相关产品推荐

