我是Pytorch的新手,怀疑我是否在图片标题中example code。在DcoderRNN类中,lstm定义为,
self.lstm = nn.LSTM(embed_size, hidden_size, num_layers, batch_first=True)
在前进功能中,
embeddings = self.embed(captions)
embeddings = torch.cat((features.unsqueeze(1), embeddings), 1)
我们首先嵌入字幕,然后使用EncoderCNN中的上下文功能连接嵌入,但是concat会增加嵌入大小的大小,我们可以将它转发到lstm吗?因为lstm的输入大小已经定义为embed_size。
我在这里遗漏了什么吗?提前谢谢。
答案 0 :(得分:2)
您可以分析所有输入和输出张量的形状,然后您将更容易理解需要进行哪些更改。
让我们说:captions = B x S
其中S
=句子(标题)长度。
embeddings = self.embed(captions)
现在,embeddings = B x S x E
其中E
= embed_size。
embeddings = torch.cat((features.unsqueeze(1), embeddings), 1)
此处,embeddings = B x (S + 1) X E
。
我的理解是说你在这里做错了。我想你应该沿轴= 2连接特征。因为您可能希望将图像功能与字幕中每个单词的嵌入一词连接起来。所以,如果你这样做:
embeddings = torch.cat((features.unsqueeze(1), embeddings), 2)
结果是,embeddings = B X S X (E + F)
其中E + F
= embed_size + img_feat_size
然后您需要按如下方式修改LSTM定义。
self.lstm = nn.LSTM(embed_size+img_feat_size, hidden_size, num_layers, batch_first=True)
我的经验表明,人们通常会将图像特征与单词特征连接起来并将其传递给LSTM图层。