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

时间:2020-06-11 07:13:25

标签: python pytorch conv-neural-network lstm recurrent-neural-network

我是CNN,RNN和深度学习的新手。 我正在尝试构建将CNN和RNN结合在一起的体系结构。 输入图像大小= [20,3,48,48] CNN输出大小= [20,64,48,48] 现在我希望CNN输出成为RNN输入 但据我所知,RNN的输入必须仅是3维的,即[seq_len,batch,input_size] 如何为RNN输入将4维[20,64,48,48]张量转换为3维?

还有另一个问题,我该如何使用以下方式初始化第一个隐藏状态?

torch.zeros()

我不知道我应该在此函数中传递哪些确切信息。我唯一知道的是

[layer_dim, batch, hidden_dim]

谢谢。

3 个答案:

答案 0 :(得分:0)

您的问题很有趣。CNN的输出为4维,而RNN的输入则为3维。

很显然,您知道维度的含义。问题在于形状操作。

答案 1 :(得分:0)

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

seq_len是每个流中的时间步数。由于一次只能输入一张图像,因此seq_len = 1

现在,必须将20大小的(64, 48, 48)张图片转换为该格式

由于输入的大小为(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)

这将为您提供结果。

答案 2 :(得分:0)

通过@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
相关问题