Как конкатенировать тензор WITHIN ось = 1? - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть тензор формы (2,2,2,2):

tensor([[[[   5.,    5.],
          [   5.,    5.]],

         [[  10.,   10.],
          [  10.,   10.]]],


        [[[ 100.,  100.],
          [ 100.,  100.]],

         [[1000., 1000.],
          [1000., 1000.]]]], device='cuda:0')

Я хочу преобразовать его так, чтобы тензор вдоль оси = 1 повторялся 3 раза. И после применения .view(-1) к этому я получаю 1D результирующий тензор как:

tensor([   5.,    5.,    5.,    5.,   5.,    5.,    5.,    5.,   5.,    5.,    5.,    5.,   10.,   10.,   10.,   10.,   10.,   10.,   10.,   10.,   10.,   10.,   10.,   10.,  100.,  100.,  100.,  100.,  100.,  100., 100.,  100.,  100.,  100., 100.,  100.,  100.,  100.,  100.,  100., 1000., 1000., 1000., 1000.  1000., 1000., 1000., 1000. 1000., 1000., 1000., 1000. 1000., 1000., 1000., 1000.], device='cuda:0')

Как это сделать?

Ответы [ 2 ]

2 голосов
/ 30 апреля 2020

Используйте torch.repeat_interleave для повторения элементов тензора.

t.repeat_interleave(repeats=3, dim=1).view(-1)
tensor([   5.,    5.,    5.,    5.,    5.,    5.,    5.,    5.,    5.,    5.,
           5.,    5.,   10.,   10.,   10.,   10.,   10.,   10.,   10.,   10.,
          10.,   10.,   10.,   10.,  100.,  100.,  100.,  100.,  100.,  100.,
         100.,  100.,  100.,  100.,  100.,  100., 1000., 1000., 1000., 1000.,
        1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000.])
1 голос
/ 30 апреля 2020

Попробуйте:

final_features = feature_combined.view(1, -1, feature_combined.size(-1))
                                 .repeat(1, 1, 3).view(1, -1).squeeze(0)

Я предполагаю, что ваш входной тензор в форме (2, 2, 2, 2) находится в feature_combined. Форма полученного final_features будет ([48]) как вам нужно.

print(feature_combined)

>>tensor([   5.,    5.,    5.,    5.,    5.,    5.,    5.,    5.,    5.,    5.,
       5.,    5.,   10.,   10.,   10.,   10.,   10.,   10.,   10.,   10.,
      10.,   10.,   10.,   10.,  100.,  100.,  100.,  100.,  100.,  100.,
     100.,  100.,  100.,  100.,  100.,  100., 1000., 1000., 1000., 1000.,
    1000., 1000., 1000., 1000., 1000., 1000., 1000., 1000.])
...