首页 文章

DecoderRNN的输出包含额外的维度(Pytorch)

提问于
浏览
2

我开发了一个编码器(CNN) - 解码器(RNN)网络,用于pytorch中的图像字幕 . 解码器网络接收两个输入 - 来自编码器的上下文特征向量和用于训练的字幕的字嵌入 . 上下文特征向量的大小= embed_size ,它也是 Headers 中每个单词的嵌入大小 . 我在这里的问题更关注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)(上下文特征向量和嵌入式 Headers 的连续张量) . 序列的输出应该是 Headers 和形状(batch_size,caption_length,vocab_size),但我仍然收到shape的输出(batch_size,caption_length 1,vocab_size) . 任何人都可以建议我应该在我的前进功能中改变什么,以便不收到额外的第二维度?提前致谢

1 回答

  • 1

    因为在每个时间步长的LSTM(或任何RNN)中(或这里的字幕长度),将有一个输出,我在这里看不到任何问题 . 您需要做的是在第二维上输入大小(caption_length)以获得所需的输出 . (或者人们通常会将<END of SENTENCE>标签添加到目标 . 因此目标长度是 Headers 1)

相关问题