двунаправленная реализация lstm в pytorch - ошибка несоответствия размера - PullRequest
0 голосов
/ 25 марта 2020

Я путаюсь с размерами при переходе от lstm к линейному слою. Я получаю следующую ошибку: # несоответствие размера, m1: [4096 x 128], m2: [64 x 3]. Я знаю, что мне нужно каким-то образом сгладить, но не знаю, как это сделать.

Для справки batch_size = 64, hidden_dim = 64, tagset_size = 3, embedding_dim = 64. Ниже мой класс LSTM (двунаправленный lstm). Ошибка в forward () при запуске tag_space = self.f c (lstm_out). Я думаю, потому что измерения, идущие от lstm к линейным, не верны, но я не могу понять, почему (я добавил операторы print, чтобы вы могли видеть размеры).

Вот мой класс:

class LSTM(nn.Module):

 def __init__(self, embedding_dim, hidden_dim, batch_size, vocab_size, tagset_size, layer, direct, dropout):
     super(LSTM, self).__init__()
     self.hidden_dim = hidden_dim
     self.word_embeddings = nn.Embedding(vocab_size, embedding_dim, padding_idx=0)
     self.lstm = nn.LSTM(embedding_dim, hidden_dim, num_layers=layer, bidirectional=True,          dropout=0.5, batch_first=True)
     self.direct = 2 if direct else 1
     self.layer = layer
     self.fc = nn.Linear(direct*hidden_dim, tagset_size)
     self.hidden = self.init_hidden()



 def init_hidden(self):
     hid = torch.autograd.Variable(torch.zeros(self.layer * self.direct, batch_size,  self.hidden_dim))
     cel = torch.autograd.Variable(torch.zeros(self.layer * self.direct, batch_size,     self.hidden_dim))
     hid = hid.to(device)
     cel = cel.to(device)
     return hid, cel

 def forward(self, sentence):
     print(sentence.size()) -> torch.Size([64, 64])
     embeds = self.word_embeddings(sentence)
     print(embeds.size()) -> torch.Size([64, 64, 64])
     lstm_out, self.hidden = self.lstm(
embeds, self.hidden) 
     print(lstm_out.size()) -> torch.Size([64, 32, 128])
     ###### Below line is the error
     tag_space = self.fc(lstm_out)
     tag_scores = F.log_softmax(tag_space, dim=2)
     return tag_scores
...