PyTorch中多对多CNN-LSTM的输出大小问题



我正试图通过结合ResNet18和LSTM来构建一个二进制时间图像分类器。然而,我以前从未真正使用过RNN,一直在努力获得正确的输出形状。

我使用的批量大小为128,序列大小为32。图像为80x80灰度图像。

目前的型号是:

class CNNLSTM(nn.Module):
def __init__(self):
super(CNNLSTM, self).__init__()
self.resnet = models.resnet18(pretrained=False)
self.resnet.conv1 = nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3)
self.resnet.fc = nn.Sequential(nn.Linear(in_features=512, out_features=256, bias=True))

self.lstm = nn.LSTM(input_size=256, hidden_size=256, num_layers=3)
self.fc1 = nn.Linear(256, 128)
self.fc2 = nn.Linear(128, 1)

def forward(self, x_3d):
#x3d:  torch.Size([128, 32, 1, 80, 80])
hidden = None
toret  = []
for t in range(x_3d.size(1)):
x = self.resnet(x_3d[:, t, :, :, :])

out, hidden = self.lstm(x.unsqueeze(0), hidden)         
x = self.fc1(out[-1, :, :])
x = F.relu(x)
x = self.fc2(x)
print("x shape: ", x.shape)

toret.append(x)
return torch.stack(toret)

它返回一个形状为torch.Size([32, 128, 1])的张量,根据我的理解,这意味着每第n行代表序列中每个元素的第n个时间步长。

如何获得128x1x32形状的输出?

还有更好的方法吗?

您可以更改维度:

a = torch.rand(32, 128, 1)
a = a.permute(1, 2, 0) # these are the indices of the original dimensions
print(a.shape)
>> torch.Size([128, 1, 32])

但您也可以在LSTM模块中设置batch_first=True

self.lstm = nn.LSTM(input_size=256, hidden_size=256, num_layers=3, batch_first=True)

这将期望LSTM的输入具有batch-size x seq-len x features的形状,并且将以相同的方式输出张量。

最新更新