Вы можете использовать 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
.
Надеюсь, это поможет.