1. ホーム
  2. python

[解決済み] PyTorchで行列の積を計算する方法

2023-07-28 13:12:51

質問

numpyでは、以下のような簡単な行列の乗算を行うことができます。

a = numpy.arange(2*3).reshape(3,2)
b = numpy.arange(2).reshape(2,1)
print(a)
print(b)
print(a.dot(b))

しかし、PyTorchのTensorsで試すと、これがうまくいきません。

a = torch.Tensor([[1, 2, 3], [1, 2, 3]]).view(-1, 2)
b = torch.Tensor([[2, 1]]).view(2, -1)
print(a)
print(a.size())

print(b)
print(b.size())

print(torch.dot(a, b))

このコードでは以下のようなエラーが発生します。

RuntimeError: inconsistent tensor size at /Users/soumith/code/builder/wheel/pytorch-src/torch/lib/TH/generic/THTensorMath.c:503 において発生しました。

PyTorchで行列の乗算を行うにはどうしたらいいか、何かアイデアはありませんか?

どのように解決するのですか?

あなたが探しているのは

torch.mm(a,b)

なお torch.dot() とは動作が異なります。 np.dot() . 何が望ましいかについての議論もありました。 ここで . 具体的には torch.dot() の両方を扱います。 ab を1次元ベクトルとして扱い、それらの内積を計算します。この動作によって a は長さ6のベクトルであり b は長さ2のベクトルなので、内積は計算できません。PyTorchで行列の乗算を行うには、以下のようにします。 torch.mm() . Numpyの np.dot() はより柔軟で、1次元配列では内積を計算し、2次元配列では行列の乗算を実行します。

人気のある要望により、関数 torch.matmul は行列の乗算を行いますが,引数が両方とも 2D であればその内積を計算し、 両方の引数が 1D . このような次元の入力では、その動作は次のものと同じです。 np.dot . また、ブロードキャストや matrix x matrix , matrix x vectorvector x vector の操作を一括して行うことができます。詳しくは、その ドキュメント .

# 1D inputs, same as torch.dot
a = torch.rand(n)
b = torch.rand(n)
torch.matmul(a, b) # torch.Size([])

# 2D inputs, same as torch.mm
a = torch.rand(m, k)
b = torch.rand(k, j)
torch.matmul(a, b) # torch.Size([m, j])