DecoderRNN的输出包含额外尺寸(Pytorch)

时间:2018-08-01 18:24:53

标签: python deep-learning pytorch rnn encoder-decoder

我开发了一个编码器(CNN)-解码器(RNN)网络,用于在pytorch中进行图像字幕。解码器网络接收两个输入:来自编码器的上下文特征向量和用于训练的标题的词嵌入。上下文特征向量的大小= embed_size,这也是标题中每个单词的嵌入大小。我在这里的问题与Class DecoderRNN的输出有关。请参考下面的代码。

class DecoderRNN(nn.Module):
def __init__(self, embed_size, hidden_size, vocab_size, num_layers=1):
    super(DecoderRNN, self).__init__()
    self.embed_size = embed_size
    self.hidden_size = hidden_size
    self.vocab_size = vocab_size
    self.num_layers = num_layers
    self.linear = nn.Linear(hidden_size, vocab_size)
    self.embed = nn.Embedding(vocab_size, embed_size)
    self.lstm = nn.LSTM(embed_size, hidden_size, num_layers, batch_first = True)


def forward(self, features, captions):
    embeddings = self.embed(captions)
    embeddings = torch.cat((features.unsqueeze(1), embeddings),1)
    hiddens,_ = self.lstm(embeddings)
    outputs = self.linear(hiddens)
    return outputs

在forward函数中,我发送一个序列(batch_size,caption_length + 1,embed_size)(上下文特征向量和嵌入式标题的串联张量)。序列的输出应为字幕,其形状应为(batch_size,caption_length,vocab_size),但我仍会收到形状为(batch_size,caption_length + 1,vocab_size)的输出。谁能建议我在前进功能中进行哪些更改,以便不接收额外的第二维?预先感谢

1 个答案:

答案 0 :(得分:1)

由于在LSTM(或任何RNN)中,每个时间步长(或此处的字幕长度)都将有一个输出,所以我在这里看不到任何问题。您需要做的是在第二维上设置输入大小(caption_length),以获得所需的输出。 (或者人们通常将标记添加到目标。因此,目标长度为caption + 1)