Keras图像分割修改num_classes为2后标签值255超出范围如何解决
报错原因
这个错误和是否将掩码识别为彩色图像无关,核心原因有两个:
- 你的二分类水域分割数据集的掩码是单通道黑白图,像素值为0(代表非水域背景)、255(代表水域前景)。而你设置了
num_classes=2,分类模型要求输入的标签必须是[0,1]范围内的连续整数,255超出了合法范围,所以触发报错。 - 你只修改了
num_classes参数,没有同步修改原示例针对牛津宠物trimap数据集设计的掩码预处理逻辑:原示例的trimap本身就做了标签归一,像素值为1、2、3,官方代码中还有一步mask = mask - 1将标签转为0、1、2的逻辑,这部分逻辑你没有适配自己的数据集。
修复方案
只需修改掩码加载和预处理环节的代码即可,具体操作如下:
步骤1:强制单通道加载掩码并归一标签
替换原数据加载流程中读取掩码的逻辑,加载时强制指定单通道模式,同时把255的像素值转为1,适配二分类的标签要求,示例代码如下:
from tensorflow.keras.utils import load_img, img_to_array # 调用该方法加载掩码即可,替换你原有代码中加载target的逻辑 def load_mask(mask_path, target_size): # color_mode设为grayscale强制单通道加载,避免被识别为3通道彩色图 mask = load_img(mask_path, color_mode="grayscale", target_size=target_size) mask_arr = img_to_array(mask) # 把255转为1,0保持不变,输出标签范围为[0,1],符合num_classes=2的要求 mask_arr = mask_arr // 255 mask_arr = mask_arr.astype("int32") return mask_arr
步骤2:删除原示例适配trimap的预处理逻辑
原官方示例里有mask = mask - 1的trimap专属处理代码,用你自己的数据集时直接删除这行即可。
步骤3:可选优化损失函数
二分类场景也可以不用num_classes=2的softmax多分类逻辑,直接调整为sigmoid二分类逻辑:输出层通道数设为1,激活函数用sigmoid,损失函数换为BinaryCrossentropy,训练收敛效率会更高。
内容的提问来源于stack exchange,提问作者Inès BEAUMONT
相关产品推荐
相关产品推荐

