我是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]
谢谢。
答案 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