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

Posted

技术标签:

【中文标题】解码器 LSTM Pytorch 的图像字幕示例输入大小【英文标题】:Image Captioning Example input size of Decoder LSTM Pytorch 【发布时间】:2018-08-11 15:03:15 【问题描述】:

我是 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 的上下文特征连接起来,但是连接会增加嵌入大小的大小,我们如何将其转发到 lstm?因为 lstm 的输入大小已经定义为 embed_size。

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

【问题讨论】:

【参考方案1】:

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

假设:标题 = 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

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

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

结果是,嵌入 = 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 层。

【讨论】:

非常感谢我在节目中发现 n tell image captioning paper 他们只将上下文传递给解码器的第一步。非常感谢您的回复

以上是关于解码器 LSTM Pytorch 的图像字幕示例输入大小的主要内容,如果未能解决你的问题,请参考以下文章

lstm in pytorch

lstm in pytorch

使用CNN和LSTM构建图像字幕标题生成器

如何正确地为 PyTorch 中的嵌入、LSTM 和线性层提供输入?

(pytorch)LSTM自编码器在西储数据的异常检测

PyTorch:DecoderRNN:RuntimeError:输入必须有 3 维,得到 2