Я серьезно рассмотрел бы подход Оккама к 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 года, я люблю этот язык!
Я тоже наткнулся на эту проблему, и ниже я понял.
При обучении 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]))
Добавляя к ответу Уманга, я счел это важным.
Первым элементом в возвращаемом кортеже pack_padded_sequence
является тензор тензора данных, содержащий упакованную последовательность. Второй элемент представляет собой тензор целых чисел, содержащий информацию о размере партии на каждом шаге последовательности.
Важно, однако, что второй элемент (размеры партии) представляет количество элементов на каждом этапе последовательности в партии , а не переменные длины последовательности, переданные в pack_padded_sequence
.
Например, данные abc
и x
: class: PackedSequence
будут содержать данные axbc
с batch_sizes=[2,1,1]
.