pytorch: как сделать послойное умножение? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть тензор, содержащий пять матриц 2x2 - форма (1,5,2,2), и тензор, содержащий 5 элементов - форма ([5]). Я хочу умножить каждую матрицу 2x2 (в первом тензоре) на соответствующее значение (в последнем тензоре). Результирующий тензор должен иметь форму (1,5,2,2). Как это сделать?

Получение следующей ошибки при запуске этого кода

a = torch.rand(1,5,2,2)
print(a.shape)
b = torch.rand(5)
print(b.shape)
mul = a*b

RuntimeError: The size of tensor a (2) must match the size of tensor b (5) at non-singleton dimension 3

1 Ответ

1 голос
/ 02 мая 2020

Вы можете использовать a * b или torch.mul(a, b) , но вы должны использовать permute() до и после умножения, чтобы иметь совместимую форму:

import torch
a = torch.ones(1,5,2,2)
b = torch.rand(5)
a.shape # torch.Size([1, 5, 2, 2])
b.shape # torch.Size([5])

c = (a.permute(0,2,3,1) * b).permute(0,3,1,2)
c.shape # torch.Size([1, 5, 2, 2])

# OR #
c = torch.mul(a.permute(0,2,3,1), b).permute(0,3,1,2)
c.shape # torch.Size([1, 5, 2, 2])

Функция permute() транспонирует размерность в порядке своих аргументов. То есть a.permute(0,2,3,1) будет иметь форму torch.Size ([1, 2, 2, 5]), которая соответствует форме b (torch.Size ([5])) для умножения матриц, так как последнее измерение a соответствует первому измерению b. После того, как мы закончили sh умножение, мы снова переносим его, используя permute(), в. Желаемая форма факела. Размер ([1, 5, 2, 2]) по перестановке (0,3,1,2).

Вы можете прочитать о permute() в документах . Но он работает с аргументами, нумерующими текущую форму [1, 5, 2, 2] от 0 до 3, и переставляет при вставке аргументов, то есть для a.permute(0,2,3,1) он будет сохранять первое измерение на своем месте, так как первый аргумент равен 0, во втором измерении он переместится в четвертое измерение, поскольку индекс 1 является четвертым аргументом. А третье и четвертое измерения переместятся во второе и третье измерения, потому что индексы 2 и 3 расположены на втором и третьем месте. Помните, например, когда речь идет о 4-м измерении, его представление в качестве аргумента равно 3 (а не 4).

EDIT Если вы хотите поэлементно умножать тензоры формы [32,5 , 2,2] и [32,5], например, чтобы каждая матрица 2x2 была умножена на соответствующее значение, можно изменить размеры как [2,2,32,5] на permute(2,3,0,1), а затем выполнить умножение на a * b и затем возврат к исходной форме на permute(2,3,0,1) снова. Ключевым моментом здесь является то, что последние n размеры первой матрицы должны совпадать с первыми n размерами второй матрицы. В нашем случае n=2.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...