在PyTorch中逐片地将3D医学图像馈送到2D卷积LSTM

时间:2020-03-25 14:40:39

标签: python deep-learning pytorch lstm medical

我正在进行图像分割。我想将3D CT图像的切片尺寸(深度)视为时间或序列尺寸,并在2D切片集上使用递归网络来捕获依赖性。

我正在使用Convolutional LSTM以便将LSTM用于图像。更具体地说,我需要双向卷积LSTM。我正在使用上述来源中的convolutional_rnn.Conv2dLSTM(),但不确定是不是最佳选择。

现在的问题是如何实现这一目标。目前,这是我实施的模型,显然是错误的(在PyTorch 1.3中),

class model(nn.Module):
    def __init__(self, n_in_channels=1, CNN_out_ch=16):
        super().__init__()
        self.cnn = MyCNN(n_in_channels=n_in_channels)
        self.CNN_out_ch = CNN_out_ch
        self.rnn = convolutional_rnn.Conv2dLSTM(in_channels=CNN_out_ch, out_channels=CNN_out_ch,
                                   kernel_size=5, num_layers=2, bidirectional=True,
                                   dilation=1, dropout=0.5, batch_first=True)
        self.dropout = nn.Dropout(0.5)
        self.pool = nn.MaxPool2d(kernel_size=2)


    def forward(self, input_tensor):
        image_stack = torch.zeros((input_tensor.shape[0], input_tensor.shape[2],
                                  self.CNN_out_ch, input_tensor.shape[3], input_tensor.shape[4]))
        # CNN part
        for i in range(input_tensor.shape[2]):
            slice_output = self.cnn(input_tensor[:,:,i,:,:])
            image_stack[:,i] = slice_output

        # Recurrent part
        image_stack = self.dropout(image_stack)
        image_stack, _ = self.rnn1(image_stack)

        image_stack_new = []
        for i in range(image_stack.shape[1]):
            image_stack_new.append(self.pool(image_stack[:,i]))
        image_stack = torch.stack(image_stack_new, dim=1)

我对input_tensor的{​​{1}}是forward()。首先,我将图像在切片尺寸上循环放入2D CNN中(移除2D CNN中最终的完全连接层,并输出具有16个通道的特征图)。

然后再次收集切片,并将其整形为shape(batch, channel, depth or slice, height, width),就像在LSTM中一样,批次后有时间维度。然后,我应用一个dropout,然后应用BiCLSTM。

最后,再次在切片尺寸上循环,对每个切片应用2D池化。

有人可以在这里捕获问题吗?

0 个答案:

没有答案