Упакованный_последовательность / pad_sequence Pytorch дополняет тензоры по вертикали для списка тензоров - PullRequest
0 голосов
/ 02 июня 2019

Я пытаюсь дополнить последовательность тензоров для мини-дозирования LSTM, где каждый временной шаг в последовательности содержит подсписок тензоров (представляющих несколько объектов за один временной шаг).

Например, последовательность 1 будет иметь 3 временных шага, а в каждом временном шаге есть 2 функции. Пример ниже будет:

Последовательность 1 = [[1,2], [2,2], [3,3], [3,2], [3,2]]

Последовательность 2 = [[4,2], [5,1], [4,4]]

Последовательность 3 = [[6,9]]

Я запускаю функцию pad_sequence в pytorch (это касается и pack_sequence), как показано ниже:

import torch
import torch.nn.utils.rnn as rnn_utils

a = torch.tensor([[1,2],[2,2],[3,3],[3,2],[3,2]])
b = torch.tensor([[4,2],[5,1],[4,4]])
c = torch.tensor([[6,9]])
result = rnn_utils.pad_sequence([a, b, c])

Мой ожидаемый результат выглядит следующим образом:

Последовательность 1 = [[1,2], [2,2], [3,3], [3,2], [3,2]]

последовательность 2 = [[4,2], [5,1], [4,4], [0,0], [0,0]]

Последовательность 3 = [[6,9], [0,0], [0,0], [0,0], [0,0]]

Однако вывод, который я получил, выглядит следующим образом:

tensor([[[1, 2],
         [4, 2],
         [6, 9]],

        [[2, 2],
         [5, 1],
         [0, 0]],

        [[3, 3],
         [4, 4],
         [0, 0]],

        [[3, 2],
         [0, 0],
         [0, 0]],

        [[3, 2],
         [0, 0],
         [0, 0]]])

Кажется, что отступы идут вертикально, а не то, что я ожидаю. Как мне получить правильный отступ, который мне нужен?

1 Ответ

0 голосов
/ 02 июня 2019

Просто измените

result = rnn_utils.pad_sequence([a, b, c])

на

result = rnn_utils.pad_sequence([a, b, c], batch_first=True)
seq1 = result[0]
seq2 = result[1]
seq3 = result[2]

По умолчанию batch_first имеет значение False.Выходные данные будут в B x T x *, если True, или в T x B x * в противном случае, где

B - размер пакета.Он равен числу элементов в sequences,

T - длина самой длинной последовательности, а

* - любое количество конечных измерений, включая ни одного.

выход:

tensor([[1, 2],
        [2, 2],
        [3, 3],
        [3, 2],
        [3, 2]]) # sequence 1
tensor([[4, 2],
        [5, 1],
        [4, 4],
        [0, 0],
        [0, 0]]) # sequence 2
tensor([[6, 9],
        [0, 0],
        [0, 0],
        [0, 0],
        [0, 0]]) # sequence 3
...