图像字幕解码器LSTM Pytorch的输入大小示例

时间:2018-03-03 14:47:10

标签: deep-learning lstm torch pytorch

我是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。

我在这里遗漏了什么吗?提前谢谢。

1 个答案:

答案 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图层。