Как LSTM обрабатывает данные Packed Sequence в PyTorch? [Дубликат]

Я серьезно рассмотрел бы подход Оккама к Razor здесь:

td = str(timedelta).split('.')[0]

Это возвращает строку без микросекунд

Если вы хотите регенерировать объект datetime.timedelta, просто выполните это:

h,m,s = re.split(':', td)
new_delta = datetime.timedelta(hours=int(h),minutes=int(m),seconds=int(s))

2 года, я люблю этот язык!

3
задан Aaron 25 June 2018 в 19:40
поделиться

2 ответа

Я тоже наткнулся на эту проблему, и ниже я понял.

При обучении RNN (LSTM или GRU или ванили-RNN) трудно выполнять последовательности переменной длины. Например: если длина последовательностей в партии размером 8 [4,6,8,5,4,3,7,8], вы будете заполнять все последовательности, и это приведет к 8 последовательностям длины 8. Вы бы закончите выполнение 64 вычислений (8x8), но вам нужно было выполнить всего 45 вычислений. Более того, если вы хотите сделать что-то необычное, как использование двунаправленного RNN, сложнее будет выполнять пакетные вычисления только путем заполнения, и вы можете в конечном итоге сделать больше вычислений, чем требуется.

Вместо этого pytorch позволяет нам упаковать последовательность, внутренне упакованная последовательность является кортежем из двух списков. Один содержит элементы последовательностей. Элементы чередуются по временным шагам (см. Пример ниже), а другие содержат размер каждой последовательности размера партии на каждом шаге. Это полезно для восстановления фактических последовательностей, а также для того, чтобы сообщать RNN, что такое размер партии на каждом временном шаге. Это было указано Аароном. Это можно передать в RNN, и он будет внутренне оптимизировать вычисления.

Возможно, в некоторых случаях я был неясен, поэтому дайте мне знать, и я могу добавить дополнительные пояснения.

 a = [torch.tensor([1,2,3]), torch.tensor([3,4])]
 b = torch.nn.utils.rnn.pad_sequence(a, batch_first=True)
 >>>>
 tensor([[ 1,  2,  3],
    [ 3,  4,  0]])
 torch.nn.utils.rnn.pack_padded_sequence(b, batch_first=True, lengths=[3,2]
 >>>>PackedSequence(data=tensor([ 1,  3,  2,  4,  3]), batch_sizes=tensor([ 2,  2,  1]))
3
ответ дан Umang Gupta 15 August 2018 в 21:10
поделиться

Добавляя к ответу Уманга, я счел это важным.

Первым элементом в возвращаемом кортеже pack_padded_sequence является тензор тензора данных, содержащий упакованную последовательность. Второй элемент представляет собой тензор целых чисел, содержащий информацию о размере партии на каждом шаге последовательности.

Важно, однако, что второй элемент (размеры партии) представляет количество элементов на каждом этапе последовательности в партии , а не переменные длины последовательности, переданные в pack_padded_sequence.

Например, данные abc и x: class: PackedSequence будут содержать данные axbc с batch_sizes=[2,1,1].

2
ответ дан Aaron 15 August 2018 в 21:10
поделиться
  • 1
    Спасибо, я полностью забыл об этом. и допустил ошибку в моем ответе, чтобы обновить это. Тем не менее, я посмотрел на вторую последовательность, как на некоторые данные, необходимые для восстановления последовательностей, и именно поэтому испортил мое описание – Umang Gupta 25 June 2018 в 21:52
Другие вопросы по тегам:

Похожие вопросы: