*と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)
の場合は同じではありません。
_*
_を使用する場合、乗算は要素ごとに行われます。_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))
と同じになります。