LSTM возвращает только нули (PyTorch) - PullRequest
0 голосов
/ 01 июля 2019

После успешного внедрения LSTM «с нуля» на основе линейных слоев я решил начать использовать существующий класс LSTM, чтобы упростить процесс и повысить производительность.Но почему-то, когда я пытаюсь это сделать, он возвращает только тензоры, полные нулей.Вот модель:

class pytorchLSTM(nn.Module):
    def __init__(self,input_size,hidden_size):
        super().__init__()
        self.input_size = input_size
        self.hidden_size = hidden_size
        self.lstm = nn.LSTM(input_size, hidden_size)
        self.softmax = nn.LogSoftmax(dim = 1)

    def forward(self, input):
        out, hidden = self.lstm(input)
        out = self.softmax(out)
        return out, hidden

на входе находится тензор (1,1,60), представляющий закодированную букву в горячем виде:

tensor([[[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
          0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
          0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
          0., 0., 0., 0., 0., 0., 0., 1., 0.]]])

, и модели всегда возвращаются (Я пытался изменить значения внутри ввода, но результат всегда один и тот же):

tensor([[[0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]],
        grad_fn=<LogSoftmaxBackward>)

Есть идеи, где моя ошибка и что я неправильно понял в классе LSTM?

1 Ответ

2 голосов
/ 01 июля 2019

Вы передаете ввод формы (1,1,60), которая может быть описана как (sequence_length, batch_size, feature_size), где feature_size является двоичным.

Я не уверен, почему вы вообще используете LogSoftmax, так как он не рекомендуется и численно нестабилен, и рекомендуется использовать torch.nn.CrossEntropyLoss для получения логитов прямо из вашей сети, но это не проблема здесь (может быть позже).

IIUC вы пытаетесь предсказать другой тензор формы (sequence_length, batch_size, feature_size), например следующая буква в слове (или та же, что и после ввода, не знаю). Вам нужно сделать LogSoftmax(dim=2) (не уверен, сработает ли dim=-1), в настоящее время вы используете максимальный размер пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...