Вывод DecoderRNN содержит дополнительные измерения (Pytorch)
Я разработал сеть Encoder(CNN)-Decoder (RNN) для субтитров изображения в pytorch. Сеть декодера принимает два входных вектора - вектор признака контекста от кодера и вложение слова заголовка для обучения. Вектор контекстного объекта имеет размер = embed_size
, который также является размером вложения каждого слова в заголовке. Мой вопрос здесь больше касается вывода класса 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) . Может ли кто-нибудь предложить, что я должен изменить в моей функции пересылки, чтобы дополнительное 2-е измерение не было получено? заранее спасибо
1 ответ
Поскольку в LSTM (или в любом RNN) для каждого временного шага (или длины заголовка здесь) будет один выход, я не вижу здесь никакой проблемы. Что вам нужно сделать, это сделать размер ввода (caption_length) во втором измерении, чтобы получить требуемый результат. (или люди обычно добавляют тег