Я путаюсь с размерами при переходе от 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