Pytorch,如何将CNN的输出馈送到RNN的输入中?



我是CNN、RNN和深度学习的新手。 我正在尝试制作结合CNN和RNN的架构。 输入图像大小 = [20,3,48,48] a CNN 输出大小 = [20,64,48,48] 现在我希望CNN输出是RNN输入 但据我所知,RNN 的输入必须只是 3 维的,即 [seq_len、批处理、input_size] 如何将 4 维 [20,64,48,48] 张量转换为 RNN 输入的 3 维张量?

还有一个问题,我如何启动第一个隐藏状态

torch.zeros()

我不知道我应该在这个函数中传递什么确切的信息。 我唯一知道的是

[layer_dim, batch, hidden_dim]

谢谢。

我假设这里的20是一个批次的大小。在这种情况下,请设置batch = 20

seq_len是每个流中的时间步长数。由于在一个时间步长输入一个图像,因此seq_len = 1.

现在,必须将大小(64, 48, 48)20图像转换为格式

由于输入的大小为 (64, 48, 48(,因此input_size = 64 * 48 * 48

model = nn.LSTM(input_size=64*48*48, hidden_size=1).to(device)
#Generating input - 20 images of size (60, 48, 48)
cnn_out = torch.randn((20, 64, 48, 48)).requires_grad_(True).to(device)
#To pass it to LSTM, input must be of the from (seq_len, batch, input_size)
cnn_out = cnn_out.view(1, 20, 64*48*48)
model(cnn_out)

这将为您提供结果。

通过遵循@Arun灵魂。最后我可以通过RNN层传递图像张量 但接下来的问题是 pytorch 如何仅将第一个隐藏状态作为 [1, 1, 1]。我不知道为什么。现在我的RNN输出是[1,20,1]。 我以为我的输出将是 [1, 20, 147456]。所以我可以将输出形状重新塑造回图像输入形状 [20, 64, 48, 48]

class Rnn(nn.Module):
def __init__(self):
super(Rnn, self).__init__()
self.rnn = nn.RNN(64*48*48, 1, 1, batch_first=True, nonlinearity='relu')
def forward(self, x):
batch_size = x.size(0)
hidden = self.init_hidden(batch_size)
images = x.view(1, 20, 64*48*48)
out, hidden = self.rnn(images, hidden)
out = torch.reshape(out, (20,64,96,96))
return out, hidden
def init_hidden(self, batch_size):
hidden = torch.zeros(1, 1, 1).to(device)
return hidden

你的问题很有趣。CNN的输出是4维的,但RNN的输入需要3维。

不知不觉地,你知道维度的含义。问题在于形状操作。

最新更新