Конкатат тензоров в PyTorch - PullRequest
       30

Конкатат тензоров в PyTorch

0 голосов
/ 17 февраля 2019

У меня есть тензор с именем data формы [128, 4, 150, 150], где 128 - размер пакета, 4 - количество каналов, а последние 2 измерения - высота и ширина.У меня есть другой тензор fake формы [128, 1, 150, 150].

Я хочу отбросить последний list/array из 2-го измерения data;форма данных теперь будет [128, 3, 150, 150];и объединить его с fake, давая выходной размер конкатенации как [128, 4, 150, 150].

По сути, другими словами, я хочу объединить первые 3 измерения data с fake, чтобы получить4-мерный тензор.

Я использую PyTorch и натолкнулся на функции torch.cat() и torch.stack()

Вот пример кода, который я написал:

fake_combined = []
        for j in range(batch_size):
            fake_combined.append(torch.stack((data[j][0].to(device), data[j][1].to(device), data[j][2].to(device), fake[j][0].to(device))))
fake_combined = torch.tensor(fake_combined, dtype=torch.float32)
fake_combined = fake_combined.to(device)

Но я получаю сообщение об ошибке в строке:

fake_combined = torch.tensor(fake_combined, dtype=torch.float32)

Ошибка:

ValueError: only one element tensors can be converted to Python scalars

Кроме того, если я печатаю форму fake_combined, я получаю выводкак [128,] вместо [128, 4, 150, 150]

И когда я печатаю форму fake_combined[0], я получаю вывод как [4, 150, 150], как и ожидалось.

Так что мой вопросПочему я не могу преобразовать список в тензор, используя torch.tensor().Я что-то пропустил?Есть ли лучший способ сделать то, что я собираюсь сделать?

Любая помощь будет оценена!Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

@ rollthedice32 ответ отлично работает.В образовательных целях здесь используется torch.cat

a = torch.rand(128, 4, 150, 150)
b = torch.rand(128, 1, 150, 150)

# Cut out last dimension
a = a[:, :3, :, :]
# Concatenate in 2nd dimension
result = torch.cat([a, b], dim=1)
print(result.shape)
# => torch.Size([128, 4, 150, 150])
0 голосов
/ 17 февраля 2019

Вы также можете просто назначить это конкретное измерение.

orig = torch.randint(low=0, high=10, size=(2,3,2,2))
fake = torch.randint(low=111, high=119, size=(2,1,2,2))
orig[:,[2],:,:] = fake

Оригинал до

tensor([[[[0, 1],
      [8, 0]],

     [[4, 9],
      [6, 1]],

     [[8, 2],
      [7, 6]]],


    [[[1, 1],
      [8, 5]],

     [[5, 0],
      [8, 6]],

     [[5, 5],
      [2, 8]]]])

Подделка

tensor([[[[117, 115],
      [114, 111]]],


    [[[115, 115],
      [118, 115]]]])

Оригинал после

tensor([[[[  0,   1],
      [  8,   0]],

     [[  4,   9],
      [  6,   1]],

     [[117, 115],
      [114, 111]]],


    [[[  1,   1],
      [  8,   5]],

     [[  5,   0],
      [  8,   6]],

     [[115, 115],
      [118, 115]]]])

Надеюсь, это поможет!:)

...