web-dev-qa-db-ja.com

matmulと通常のテンソルの乗算に違いはありますか

*とmatmulを使用した2つのテンソル間の乗算の間で混乱しています。以下は私のコードです

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

ここでは、重みと特徴を乗算したいと思います。したがって、それを行う1つの方法は次のとおりです。

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)の場合は同じではありません。

4
InAFlash

_*_を使用する場合、乗算は要素ごとに行われます。_torch.mm_を使用する場合、それは行列の乗算です。

例:

_a = torch.Rand(2,5)
b = torch.Rand(2,5)
result = a*b 
_

resultaまたは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))と同じになります。

5
Umang Gupta