Image Captioning 解码器 LSTM Pytorch 的示例输入大小

Image Captioning Example input size of Decoder LSTM Pytorch

我是 Pytorch 的新手,我对图像字幕有疑问 example code。在 DcoderRNN class 中,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 的上下文特征进行连接,但是连接增加了嵌入大小的大小,我们如何将其转发到 lstm?因为 lstm 的输入大小已经定义为 embed_size.

我是不是漏掉了什么?提前致谢。

您可以分析所有输入和输出张量的形状,然后您会更容易理解需要进行哪些更改。

假设:字幕 = B x S 其中 S = 句子(字幕)长度。

embeddings = self.embed(captions)

现在,嵌入 = B x S x E 其中 E = embed_size.

embeddings = torch.cat((features.unsqueeze(1), embeddings), 1)

此处,嵌入 = B x (S + 1) X E

我的理解是你在这里做错了。我猜你应该沿着 axis=2 连接特征。因为您可能想将图像特征与标题中每个词的词嵌入连接起来。所以,如果你这样做:

embeddings = torch.cat((features.unsqueeze(1), embeddings), 2)

结果是,embeddings = B X S X (E + F) where 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 层。