Это действительно суммирует вывод, здесь комментарий 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]])