我正在进行图像分割。我想将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池化。
有人可以在这里捕获问题吗?