Ожидаемые размеры скрытого состояния LSTM не учитывают размер пакета - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть эта модель декодера, которая должна принимать пакеты вложений предложений (размер пакета = 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 ]

0 голосов
/ 07 февраля 2019

измените .view (), чтобы отразить [1, размер партии, embedding_size] в качестве первого измерения.

также вам не нужно инициализировать нулевой тензор, Pytorch использует нулевой тензор, если нет тензоровпредоставляются в качестве начального тензора.

0 голосов
/ 07 февраля 2019

Когда вы создаете 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()

С обоими изменениями он должен работать нормально:)

...