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

3D UNet NIfTI血管分割的类别数设置与激活函数选型问题

3D U-Net二分类分割输出层配置方案

两种配置均可实现血管/背景二分类分割,核心要求是标签编码、输出激活、损失函数三者必须匹配,不可交叉混用,具体差异和选择建议如下:


方案1:n_classes=1 + sigmoid激活(推荐用于你的血管分割任务)

  • 核心逻辑:将任务建模为逐体素的二分类判别,输出单通道概率图,每个体素的输出值代表当前位置属于血管的概率,取值范围0~1
  • 配套配置要求:
    • 标签处理:无需做one-hot编码,保留原始mask的0(背景)/1(血管)取值即可,仅需在最后扩充一个通道维度匹配张量shape
    • 模型输出层:最后一层1×1×1卷积的输出通道设为1,激活函数替换为sigmoid
    • 损失函数:选用binary_crossentropy,或医学分割常用的单通道版本Dice Loss、Tversky Loss,针对血管占比极低的类别不平衡问题适配性更好
  • 优势:输出层参数量比双通道方案少50%,显存占用更低;sigmoid不会强制类别概率互斥,对血管边界、细小血管的预测表现更稳定,是当前医学影像二分类分割的主流选型。

方案2:n_classes=2 + softmax激活

  • 核心逻辑:将背景、血管视为两个完全互斥的类别,输出双通道概率图,每个体素位置的两个输出值分别代表属于背景、血管的概率,二者加和恒为1
  • 配套配置要求:
    • 标签处理:需要用tf.keras.utils.to_categorical将单通道0/1标签转换为2通道的one-hot编码,你当前代码中的数据生成器逻辑已经符合这个要求
    • 模型输出层:最后一层1×1×1卷积的输出通道设为2,激活函数用softmax,你当前的模型代码这部分逻辑没有错误
    • 损失函数:选用categorical_crossentropy,或适配one-hot标签的多通道版本Dice Loss
  • 劣势:对于二分类任务存在参数冗余,显存占用更高;softmax强制概率和为1的特性,在标注模糊的血管边界区域容易产生不合理的预测结果,更适合类别数≥3的多分类分割场景。

代码修改参考(适配推荐的n_classes=1方案)

n_classes = 1
class DataGenerator(tf.keras.utils.Sequence):

    def __init__(self, img_paths, mask_paths, batch_size, n_classes):
        self.x, self.y = img_paths, mask_paths
        self.batch_size = batch_size
        self.n_classes = n_classes

    def __len__(self):
        return math.ceil(len(self.x) / self.batch_size)

    def read_nifti(self, filepath):
        volume = nib.load(filepath).get_fdata()
        volume = np.array(volume)
        return volume


    def __getitem__(self, idx):

        batch_x = self.x[idx * self.batch_size:(idx + 1) * self.batch_size]
        batch_y = self.y[idx * self.batch_size:(idx + 1) * self.batch_size]

        image = [self.read_nifti(image_file) for image_file in batch_x]
        image = np.array(image, dtype=np.float32)
        image = tf.expand_dims(image, axis=-1)
        
        label = [self.read_nifti(mask_file) for mask_file in batch_y]
        label = np.array(label, dtype=np.float32)
        # 移除one-hot转换,仅扩充通道维度
        label = tf.expand_dims(label, axis=-1)
        
        return image, label

'''---------------------build CNN model -------------------'''
def unet3d_model1(nx= 224, ny=224, nz=64):

    inputs = Input((nx, ny, nz, 1))
    conv1 = Conv3D(32, (3, 3, 3), activation='relu', padding='same')(inputs)
    conv1 = Conv3D(32, (3, 3, 3), activation='relu', padding='same')(conv1)
    pool1 = MaxPool3D(pool_size=(2, 2, 2))(conv1)

    conv2 = Conv3D(64, (3, 3, 3), activation='relu', padding='same')(pool1)
    conv2 = Conv3D(64, (3, 3, 3), activation='relu', padding='same')(conv2)
    pool2 = MaxPool3D(pool_size=(2, 2, 2))(conv2)

    conv3 = Conv3D(128, (3, 3, 3), activation='relu', padding='same')(pool2)
    conv3 = Conv3D(128, (3, 3, 3), activation='relu', padding='same')(conv3)
    pool3 = MaxPool3D(pool_size=(2, 2, 2))(conv3)

    conv4 = Conv3D(256, (3, 3, 3), activation='relu', padding='same')(pool3)
    conv4 = Conv3D(256, (3, 3, 3), activation='relu', padding='same')(conv4)

    up5 = UpSampling3D(size=(2, 2, 2))(conv4)
    merge5 = concatenate([up5, conv3])
    conv5 = Conv3D(128, (3, 3, 3), activation='relu', padding='same')(merge5)
    conv5 = Conv3D(128, (3, 3, 3), activation='relu', padding='same')(conv5)

    up6 = UpSampling3D(size=(2, 2, 2))(conv5)
    merge6 = concatenate([up6, conv2])
    conv6 = Conv3D(64, (3, 3, 3), activation='relu', padding='same')(merge6)
    conv6 = Conv3D(64, (3, 3, 3), activation='relu', padding='same')(conv6)

    up7 = UpSampling3D(size=(2, 2, 2))(conv6)
    merge7 = concatenate([up7, conv1])
    conv7 = Conv3D(32, (3, 3, 3), activation='relu', padding='same')(merge7)
    conv7 = Conv3D(32, (3, 3, 3), activation='relu', padding='same')(conv7)

    # 输出层改为单通道+sigmoid
    conv8 = Conv3D(n_classes, (1, 1, 1), activation='sigmoid')(conv7)

    model = Model(inputs=inputs, outputs=conv8)

    return model

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:27:21