Ожидаемые размеры скрытого состояния LSTM не учитывают размер пакета
У меня есть модель декодера, которая должна принимать пакеты вложений предложений (размер пакета = 50, скрытый размер =300) в качестве входных данных и выводить пакет одного горячего представления предсказанных предложений:
class DecoderLSTMwithBatchSupport(nn.Module):
# Your code goes here
def __init__(self, embedding_size,batch_size, hidden_size, output_size):
super(DecoderLSTMwithBatchSupport, self).__init__()
self.hidden_size = hidden_size
self.batch_size = batch_size
self.lstm = nn.LSTM(input_size=embedding_size,num_layers=1, hidden_size=hidden_size, batch_first=True)
self.out = nn.Linear(hidden_size, output_size)
self.softmax = nn.LogSoftmax(dim=1)
def forward(self, my_input, hidden):
print(type(my_input), type(hidden))
output, hidden = self.lstm(my_input, hidden)
output = self.softmax(self.out(output[0]))
return output, hidden
def initHidden(self):
return Variable(torch.zeros(1, self.batch_size, self.hidden_size)).cuda()
Тем не менее, когда я запускаю его с помощью:
decoder=DecoderLSTMwithBatchSupport(vocabularySize,batch_size, 300, vocabularySize)
decoder.cuda()
decoder_input=np.zeros([batch_size,vocabularySize])
for i in range(batch_size):
decoder_input[i] = embeddings[SOS_token]
decoder_input=Variable(torch.from_numpy(decoder_input)).cuda()
decoder_hidden = (decoder.initHidden(),decoder.initHidden())
for di in range(target_length):
decoder_output, decoder_hidden = decoder(decoder_input.view(1,batch_size,-1), decoder_hidden)
Я получаю следующую ошибку:
Ожидаемый скрытый [0] размер (1, 1, 300), полученный (1, 50, 300)
Чего мне не хватает, чтобы модель ожидала пакетные скрытые состояния?
2 ответа
Когда вы создаете LSTM
, флаг batch_first
не является необходимым, потому что он принимает другую форму вашего ввода. Из документов:
Если True, то входные и выходные тензоры предоставляются как (batch, seq, feature). По умолчанию: False
измените создание LSTM на:
self.lstm = nn.LSTM(input_size=embedding_size, num_layers=1, hidden_size=hidden_size)
Также есть ошибка типа. Когда вы создаете decoder_input
с помощью torch.from_numpy()
оно имеет dtype=torch.float64
, в то время как decoder_input
по умолчанию dtype=torch.float32
, Измените строку, где вы создаете decoder_input
что-то вроде
decoder_input = Variable(torch.from_numpy(decoder_input)).cuda().float()
С обоими изменениями он должен нормально работать:)
Измените .view(), чтобы отразить [1, размер пакета, embedding_size] в качестве первого измерения.
Кроме того, вам не нужно инициализировать нулевой тензор, Pytorch использует нулевой тензор, если в качестве начального тензора не предоставлено никаких тензоров.