Могу ли я использовать PyTorch LSTM с другим значением hidden_size, чем input_size? - PullRequest
6 голосов
/ 02 марта 2020

У меня есть:

    def __init__(self, feature_dim=15, hidden_size=5, num_layers=2):
        super(BaselineModel, self).__init__()
        self.num_layers = num_layers
        self.hidden_size = hidden_size

        self.lstm = nn.LSTM(input_size=feature_dim,
                            hidden_size=hidden_size, num_layers=num_layers)

и затем я получаю ошибку:

RuntimeError: The size of tensor a (5) must match the size of tensor b (15) at non-singleton dimension 2

Если я установлю два размера одинаковыми, ошибка исчезнет. Но мне интересно, если мой input_size - какое-то большое число, скажем, 15, и я хочу уменьшить количество скрытых функций до 5, почему бы это не сработало?

Ответы [ 2 ]

3 голосов
/ 06 марта 2020

Должно сработать, ошибка вероятно пришла откуда-то еще. Например, эта работа:

        feature_dim = 15
        hidden_size = 5
        num_layers = 2
        seq_len = 5
        batch_size = 3
        lstm = nn.LSTM(input_size=feature_dim,
                                    hidden_size=hidden_size, num_layers=num_layers)

        t1 = torch.from_numpy(np.random.uniform(0,1,size=(seq_len, batch_size, feature_dim))).float()
        output, states = lstm.forward(t1)
        hidden_state, cell_state = states
        print("output: ",output.size())
        print("hidden_state: ",hidden_state.size())
        print("cell_state: ",cell_state.size())

и return

    output:  torch.Size([5, 3, 5])
    hidden_state:  torch.Size([2, 3, 5])
    cell_state:  torch.Size([2, 3, 5])

Используете ли вы вывод где-то после lstm? Вы заметили, что он имеет размер, равный скрытому dim ie 5 на последнем тусклом? Похоже, вы потом используете его, думая, что он имеет размер 15 вместо

1 голос
/ 12 марта 2020

Краткий ответ: Да, input_size может отличаться от hidden_size.

. Чтобы получить подробный ответ, взгляните на формулы LSTM в документации PyTorch , Например:

Formulae for i_t

Это формула для вычисления i_t , активация входа при т шаг по времени для одного слоя. Здесь матрица W_ii имеет форму (hidden_size x input_size). Аналогично в других формулах матрицы W_if , W_ig и W_io имеют одинаковую форму. Эти матрицы проецируют входной тензор в то же пространство, что и скрытые состояния, так что их можно сложить вместе.

Возвращаясь к заданной вами задаче c, как указывалось в другом ответе, это, вероятно, ошибка в другом часть вашего кода. Не глядя на вашу forward реализацию, трудно сказать, в чем именно проблема.

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