Как я могу добавить элемент в тензор PyTorch вдоль определенного измерения? - PullRequest
2 голосов
/ 08 апреля 2020

У меня есть тензор inps, который имеет размер [64, 161, 1], и у меня есть некоторые новые данные d, который имеет размер [64, 161]. Как я могу добавить d к inps так, чтобы новый размер был [64, 161, 2]?

Ответы [ 2 ]

1 голос
/ 08 апреля 2020

Существует более чистый способ использования .unsqueeze() и torch.cat(), который напрямую использует интерфейс PyTorch:

import torch

# create two sample vectors
inps = torch.randn([64, 161, 1])
d = torch.randn([64, 161])

# bring d into the same format, and then concatenate tensors
new_inps = torch.cat((inps, d.unsqueeze(2)), dim=-1)
print(new_inps.shape)  # [64, 161, 2]

По сути, сжатие второго измерения уже приводит два тензора в один и тот же формы; Вы просто должны быть осторожны, чтобы выдавить правильное измерение. Точно так же конкатенация , к сожалению, названа иначе, чем функция с другим именем NumPy, но ведет себя так же. Обратите внимание, что вместо того, чтобы torch.cat вычислил размер, предоставив dim=-1, вы также можете явно указать размер для объединения, в этом случае заменив его на dim=2.

Имейте в виду разница между объединением и суммированием , что полезно для аналогичных задач с тензорными измерениями.

1 голос
/ 08 апреля 2020

Вы должны сначала изменить форму d, чтобы она имела третье измерение, по которому становится возможной конкатенация. После того, как у него есть третье измерение и два тензора имеют одинаковое количество измерений, вы можете использовать torch.cat ((inps, d), 2) для их укладки.

old_shape = tuple(d.shape)
new_shape = old_shape + (1,)
inps_new = torch.cat( (inps, d.view( new_shape ), 2)
...