我正在尝试构建一个 V-Net。当我在训练过程中传递图像进行分割时,softmax 激活后的输出有 2 个通道(如附件图像中指定的架构),但标签和输入只有 1 个通道。我该如何转换输出,使其成为分割后的图像?我在训练时是否只需取其中一个通道作为最终输出(例如 output = output[:, 0, :, :, :]),而另一个通道作为背景?
outputs = network(inputs)batch_size = 32outputs.shape: [32, 2, 64, 128, 128]inputs.shape: [32, 1, 64, 128, 128]labels.shape: [32, 1, 64, 128, 128]
这是我的 Vnet 前向传递:
def forward(self, x): # 初始输入转换 out = self.in_tr(x) # 向下转换 out, residual_0 = self.down_depth0(out) out, residual_1 = self.down_depth1(out) out, residual_2 = self.down_depth2(out) out, residual_3 = self.down_depth3(out) # 底层 out = self.up_depth4(out) # 向上转换 out = self.up_depth3(out, residual_3) out = self.up_depth2(out, residual_2) out = self.up_depth1(out, residual_1) out = self.up_depth0(out, residual_0) # 转换到2通道 out = self.final_conv(out) # 返回 softmax out = F.softmax(out) return out [batch_size, 2, 64, 128, 128]
如 (https://arxiv.org/pdf/1606.04797.pdf) 中描述的 V Net 架构
回答:
那篇论文有两个输出,因为它们预测两个类别:
网络预测包括两个与原始输入数据相同分辨率的体数据,通过 softmax 层处理后,输出每个体素属于前景和背景的概率。
因此,这不是一个自编码器,你的输入不会通过模型传递回输出。他们使用一组标签来区分他们感兴趣的像素(前景)和其他(背景)。如果你想以这种方式使用 V-net,你需要更改你的数据。
这不仅仅是指定一个通道作为输出那么简单,因为这是一个分类任务而不是回归任务。你需要使用带有注释标签的数据来配合这种模型架构。