多类语义分割:输出层激活函数如何选择?
多类语义分割Unet输出层激活函数选择指南
嘿,针对你用Keras搭建Unet做多类语义分割的场景,输出层的激活函数选择得结合你的任务类型来定,我给你拆解下最常用的两种方案:
1. 互斥多类分割(像素仅属于一个类别,类别数≥3)
这是语义分割里最常见的场景,比如场景分割里的“天空、道路、建筑”这类互斥类别,推荐用**softmax**作为激活函数:
- 它会把输出的每个通道值归一化到0-1区间,且所有通道的数值之和为1,完美对应每个像素属于不同类别的概率分布。
- 搭配的损失函数要注意标签格式:
- 如果你的标签是one-hot编码形式(比如每个像素是长度为类别数的向量,只有对应类别为1,其余为0),用
CategoricalCrossentropy; - 如果标签是整数索引形式(比如每个像素直接用0、1、2...代表不同类别,不用转one-hot,更节省内存),用
SparseCategoricalCrossentropy。
- 如果你的标签是one-hot编码形式(比如每个像素是长度为类别数的向量,只有对应类别为1,其余为0),用
- 代码示例(假设你有5个目标类别):
outputs = Conv2D(5, (1, 1), activation='softmax')(up_last_layer)
2. 多标签分割(像素可同时属于多个类别)
如果你的任务允许一个像素对应多个类别(比如医学影像里的“肿瘤+水肿”同时存在),那得用**sigmoid**激活函数:
- 它会让每个输出通道独立输出0-1的数值,代表该像素属于对应类别的概率,各通道之间互不干扰。
- 对应的损失函数用
BinaryCrossentropy,因为每个类别都相当于一个独立的二分类任务。
额外提醒
不管选哪种激活函数,输出层的Conv2D滤镜数量都要和你的类别数(互斥多类)或标签数(多标签)保持一致哦~
内容的提问来源于stack exchange,提问作者Kay Raymond Oskal
相关产品推荐
相关产品推荐

