PyTorch - создать дополненный тензор из последовательностей переменной длины - PullRequest
0 голосов
/ 08 сентября 2018

Я ищу хороший (эффективный и желательно простой) способ создания дополненного тензора из последовательностей переменной длины / формы. Наилучший способ, который я могу себе представить, - наивный подход, подобный этому:

import torch
seq = [1,2,3]      # seq of variable length
max_len = 5        # maximum length of seq
t = torch.zeros(5) # padding value
for i, e in enumerate(seq):
    t[i] = e
print(t)

Выход:

tensor([ 1.,  2.,  3.,  0.,  0.])

Есть ли лучший способ сделать это?

Я еще ничего не нашел, но, наверное, что-то лучше.

Я думаю о некоторой функции для расширения тензора последовательности до желаемой формы с нужным заполнением. Или что-то, чтобы создать мягкий тензор прямо из последовательности. Но, конечно, приветствуются и другие подходы.

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

В качестве дополнения к ответу, уже заданному @iacolippo:

Я только что наткнулся на torch.nn.utils.rnn.pad_sequence, так как это работает немного иначе, чем решение @iacolippo, которое я выложил здесь.

Он берет список тензоров переменной длины и объединяет их в матрицу, дополняя все последовательности до самой длинной заданной последовательности.

Пример кода:

import torch

a = torch.tensor([1,2,3])
b = torch.tensor([1,2])
c = torch.tensor([1])
torch.nn.utils.rnn.pad_sequence((a,b,c), batch_first=True)

Output - дополненные последовательности:

tensor([[ 1,  2,  3],
        [ 1,  2,  0],
        [ 1,  0,  0]])

Подпись torch.nn.utils.rnn.pad_sequence:

torch.nn.utils.rnn.pad_sequence (последовательности, batch_first = False, padding_value = 0)

  • sequence (list[Tensor]) - список последовательностей переменной длины.
  • batch_first (bool, необязательно ) - вывод будет в B x T x *, если True, или в T x B x *, в противном случае
  • padding_value (float, необязательно ) - значение для дополняемых элементов. По умолчанию: 0.
0 голосов
/ 08 сентября 2018

Сделайте вашу последовательность переменной длины a torch.Tensor и используйте torch.nn.functional.pad

import torch
import torch.nn.functional as F

seq = torch.Tensor([1,2,3])      # seq of variable length
print(F.pad(seq, pad=(0, 2), mode='constant', value=0))
 1
 2
 3
 0
 0
[torch.FloatTensor of size 5]

Подпись F.pad:

  • input: входной тензор, который является вашей последовательностью переменной длины.
  • pad: кортеж m-elem, где (m / 2) ≤ входных размеров, а m четное. В одномерном случае первый элемент - это сколько отступов влево, а второй - сколько отступов справа от вашей последовательности.
  • mode: заполнить заполнение константой или повторить границу или отразить значения.
  • value: значение заполнения, если вы выбираете постоянное заполнение.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...