我开发了一个编码器(CNN(-解码器(RNN(网络,用于pytorch中的图像字幕。解码器网络接收两个输入——来自编码器的上下文特征向量和用于训练的字幕的单词嵌入。上下文特征向量的大小=embed_size
,这也是字幕中每个单词的嵌入大小。我在这里的问题更关心类解码器RNN的输出。请参阅下面的代码。
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
在前向函数中,我发送一个序列(batch_size,caption_length+1,embed_size((上下文特征向量和嵌入字幕的级联张量(。序列的输出应该是标题和形状(batch_size,caption_length,vocab_size(,但我仍然收到形状(batch.size,caption_length+1,voca_size(的输出。
我应该在我的正向函数中更改什么,这样就不会收到额外的二维?
由于在LSTM(或任何RNN(中,对于每个时间步长(或此处的标题长度(,都会有一个输出,因此我认为这里没有任何问题。您需要做的是在第二个维度上设置输入大小(caption_length(,以获得所需的输出。(或者人们通常会在目标上添加<END of SENTENCE>标签。因此,目标长度为标题+1(