如何将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()
关键细节说明
- 维度选择:
dim=1是因为输入张量格式为BCHWD(Batch, Channel, Height, Width, Depth),通道维度是第1个索引(PyTorch采用0-based索引),确保每个像素的9个通道值被单独归一化。 - 数值验证:转换后的
pred_probs_np中,任意位置的9个通道值之和应近似为1(浮点运算误差范围内),可通过pred_probs_np.sum(axis=1)验证。 - MONAI替代方案:也可以使用MONAI内置的
Softmax层,效果完全一致:from monai.networks.layers import Softmax softmax = Softmax(dim=1).to(device) pred_probs = softmax(pred)
内容的提问来源于stack exchange,提问作者dkrolicki
相关产品推荐
相关产品推荐

