Складирование выходов LSTM в pytorch - PullRequest
0 голосов
/ 18 февраля 2019

Я проходил какое-то руководство по анализу настроений с использованием сети lstm.Приведенный ниже код говорит, что он суммирует вывод lstm.Я не знаю, как это работает.

lstm_out = lstm_out.contiguous().view(-1, self.hidden_dim)

1 Ответ

0 голосов
/ 01 мая 2019

Это действительно суммирует вывод, здесь комментарий kHarshit вводит в заблуждение!

Чтобы визуализировать это, давайте рассмотрим вывод предыдущей строки в руководстве (доступ к которому 1 мая 2019 года):

lstm_out, hidden = self.lstm(embeds, hidden)

Выходной размер этого будет [sequence_length, batch_size, hidden_size*2], согласно документации .Здесь длина, в два раза превышающая входные данные, обусловлена ​​наличием двунаправленного LSTM.Следовательно, ваша первая половина последнего измерения всегда будет выходом вперед, а затем потом выводом назад (я не совсем уверен в направлении этого, но мне кажется, что он уже в правильном направлении).

Затем, фактическая строка, которая вас беспокоит:

Мы игнорируем особенности .contiguous() здесь, но вы можете прочитать об этом в этот отличный ответ наStackoverflow .Таким образом, это в основном гарантирует, что ваш torch.Tensor находится в правильном положении в памяти.Наконец, .view() позволяет вам изменять форму полученного тензора определенным образом.Здесь мы стремимся к форме, которая имеет два измерения (как определено числом входных аргументов для .view(). В частности, второе измерение предположительно имеет размер hidden_dim. -1 для первого измерения просто означаетчто мы перераспределяем векторное измерение таким образом, что нас не заботит точное измерение, а мы просто удовлетворяем требования другого измерения.Итак, если у вас есть вектор, скажем, длины 40, и вы хотите преобразовать его в 2D-тензор (-1, 10), то результирующий тензор будет иметь форму (4, 10).

Как мыРанее мы говорили, что первая половина вектора (длина hidden_dim) является прямым выводом, а вторая половина - вторая половина, тогда результирующее разбиение на тензор (-1, hidden_dim) приведет к тензору * 1027.*, где первая строка содержит прямой вывод, «сложенный» поверх второй строки, что равно выходу обратного слоя.

Визуальный пример:

lstm_out, hidden = self.lstm(embeds, hidden)
print(lstm_out) # imagine a sample output like [1,0 , 2,0] 
                #                      forward out  | backward out

stacked = lstm_out.contiguous().view(-1,hidden_dim) # hidden_dim = 2

print(stacked) # torch.Tensor([[1,0],
               #               [2,0]])
...