есть ли разница между матмулом и обычным умножением тензоров - PullRequest
0 голосов
/ 08 ноября 2018

Я запутался между умножением между двумя тензорами, используя * и matmul.Ниже мой код

import torch
torch.manual_seed(7)
features = torch.randn((2, 5))
weights = torch.randn_like(features)

здесь, я хочу умножить вес и характеристики.Итак, один из способов сделать это выглядит следующим образом:

print(torch.sum(features * weights))

Вывод:

tensor(-2.6123)

Другой способ сделать это - использовать matmul

print(torch.mm(features,weights.view((5,2))))

, но здесь вывести

tensor([[ 2.8089,  4.6439],
        [-2.3988, -1.9238]])

Что я не понимаю здесь, так это то, почему matmul и обычное умножение дают разные результаты, когда оба одинаковы.Я что-то здесь не так делаю?

Редактировать: Когда я использую функцию (1,5), оба выхода * и matmul одинаковы.но это не то же самое, когда форма (2,5).

1 Ответ

0 голосов
/ 08 ноября 2018

Когда вы используете *, умножение поэлементно, когда вы используете torch.mm, это умножение матрицы.

Пример:

a = torch.rand(2,5)
b = torch.rand(2,5)
result = a*b 

result будет иметь формуто же самое, что a или b, т.е. (2,5), тогда как при рассмотрении операции

result = torch.mm(a,b)

Это даст ошибку несоответствия размера, поскольку это правильное умножение матриц (как мы изучаем в линейной алгебре) и a.shape[1] != b.shape[0].При применении операции просмотра в torch.mm вы пытаетесь сопоставить размеры.

В особом случае, когда фигура в некотором конкретном измерении равна 1, она становится точечным произведением и, следовательно, sum (a*b) совпадает с mm(a, b.view(5,1))

...