Итеративное умножение двух 3D-тензоров Pytorch

#python #python-3.x #pytorch #matrix-multiplication #tensor

#python #python-3.x #pytorch #умножение матрицы #тензор

Вопрос:

У меня есть два трехмерных тензора Pytorch, один из которых имеет размерность (8, 1, 1024), а другой имеет размерность (8, 59, 77). Я хочу умножить эти два тензора.

Я знаю, что они не могут быть умножены в их текущем состоянии, поэтому я хочу умножать их итеративно и добавлять в один тензор. Второй тензор может быть представлен как (8, 59, 1), когда мы выполняем итерацию по 2-му измерению. В этом состоянии умножаем его на первый тензор формы (8, 1, 1024), в результате чего получаем тензор формы (8, 59, 1024), и, наконец, добавляем все эти 77 выходных данных в один, что приводит к окончательной форме (8, 59, 1024, 77).

Однако у меня возникают проблемы с его реализацией. Кто-нибудь может мне здесь помочь?

Ответ №1:

Если бы я не испортил вычисления, это было бы эквивалентно:

 import torch

x = torch.rand(8, 1, 1024)
y = torch.rand(8, 59, 77)

torch.matmul(
    y.unsqueeze(-1),   # shape = (8, 59, 77, 1)
    x.unsqueeze(1)     # shape = (8, 1, 1, 1024)
).permute(0, 1, 3, 2)  # output shape = (8, 59, 1024, 77)
 

Обратите внимание, что в этом случае matmul выполняется пакетное умножение матрицы.