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

如何将ResidualUNet输出的Logits转换为像素类别概率?

解决方案:将Logits转换为类别概率

针对你的多分类CT分割任务(9个类别),由于模型输出的是原始Logits,需要通过Softmax函数将其转换为每个像素对应各类别的概率,原因如下:

  • 你的任务是单标签多分类(每个像素仅属于一个类别),Softmax能将每个像素的9个通道Logits归一化至0-1区间,且所有类别概率之和为1,符合概率定义。
  • 如果是多标签任务(像素可同时属于多个类别)才需要用Sigmoid,但显然你的场景不适用。

修改后的推理代码

直接在GPU上完成Softmax计算(避免数据来回传输,提升效率),再转换为numpy数组:

device = (
    "cuda"
    if torch.cuda.is_available()
    else "mps"
    if torch.backends.mps.is_available()
    else "cpu"
)

model = Unet(
    spatial_dims = 3,
    in_channels = 1,
    out_channels = 9,
    channels = (8, 16, 32, 64, 128, 256),
    strides = (2,2,2,2,2),
    num_res_units = 4,
    norm = Norm.INSTANCE
).to(device)

model.load_state_dict(torch.load(PATH_TO_SAVED_MODEL_OBJECT)["model_state_dict"])

inputs, labels = next(iter(validation_dataloader))   # 获取单张图像 - batch_size=1
inferer = SimpleInferer()   # MONAI内置的简易推理器
inputs = inputs.to(device)  # 传入GPU
labels = labels.to(device)  # 传入GPU

# 执行推理得到原始Logits
pred = inferer(inputs = inputs, network=model)

# 对通道维度(dim=1,对应BCHWD中的C)应用Softmax,得到概率分布
pred_probs = torch.nn.functional.softmax(pred, dim=1)

# 转换为numpy数组用于后续可视化或分析
pred_probs_np = pred_probs.detach().cpu().numpy()

关键细节说明

  1. 维度选择:dim=1是因为输入张量格式为BCHWD(Batch, Channel, Height, Width, Depth),通道维度是第1个索引(PyTorch采用0-based索引),确保每个像素的9个通道值被单独归一化。
  2. 数值验证:转换后的pred_probs_np中,任意位置的9个通道值之和应近似为1(浮点运算误差范围内),可通过pred_probs_np.sum(axis=1)验证。
  3. MONAI替代方案:也可以使用MONAI内置的Softmax层,效果完全一致:
    from monai.networks.layers import Softmax
    softmax = Softmax(dim=1).to(device)
    pred_probs = softmax(pred)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 10:55:35