PyTorch torch.matmul 関数
torch.matmulPyTorch で行列積を実行するための関数です。異なる次元の入力をサポートし、1次元、2次元、およびそれ以上の次元のテンソル乗算を処理できます。
これはディープラーニングで最もよく使われる演算の1つであり、ニューラルネットワークの順伝播は本質的に一連の行列積です。
関数定義
torch.matmul(input, other, out=None)
引数:
input(Tensor): 1つ目の入力テンソル。other(Tensor): 2つ目の入力テンソル。out(Tensor, オプション): 出力テンソル。
戻り値:
torch.Tensor: 行列積の結果を返します。
使用例
例1:2次元行列積
例
import torch
# 2つの2次元行列を作成
a = torch.randn(3, 4) # 3x4 行列
b = torch.randn(4, 5) # 4x5 行列
# 行列積
c = torch.matmul(a, b)
print("a の形状:", a.shape)
print("b の形状:", b.shape)
print("c の形状:", c.shape)
# 2つの2次元行列を作成
a = torch.randn(3, 4) # 3x4 行列
b = torch.randn(4, 5) # 4x5 行列
# 行列積
c = torch.matmul(a, b)
print("a の形状:", a.shape)
print("b の形状:", b.shape)
print("c の形状:", c.shape)
出力結果は次のとおりです:
a 的形状: torch.Size([3, 4]) b 的形状: torch.Size([4, 5]) c 的形状: torch.Size([3, 5])
例 2: ベクトルと行列の乗算
例
import torch
# ベクトルと行列を作成
vector = torch.randn(4) # 4次元ベクトル
matrix = torch.randn(4, 5) # 4x5 行列
# ベクトルと行列の乗算
result = torch.matmul(vector, matrix)
print("ベクトルの形状:", vector.shape)
print("行列の形状:", matrix.shape)
print("結果の形状:", result.shape)
print(result)
# ベクトルと行列を作成
vector = torch.randn(4) # 4次元ベクトル
matrix = torch.randn(4, 5) # 4x5 行列
# ベクトルと行列の乗算
result = torch.matmul(vector, matrix)
print("ベクトルの形状:", vector.shape)
print("行列の形状:", matrix.shape)
print("結果の形状:", result.shape)
print(result)
出力結果は次のとおりです:
向量的形状: torch.Size([4]) 矩阵的形状: torch.Size([4, 5]) 结果的形状: torch.Size([5]) tensor([-0.7837, 0.3684, -0.6542, -0.4594, 1.5328]) </p> <h3>示例 3: 批量矩阵乘法</h3> <div class="example"> <h2 class="example">实例</h2> <div class="example_code"> <span style="color: Green;font-weight:bold;">import</span> torch<br /> <br /> <span style="color: #a50"># 创建批量矩阵</span><br /> batch_a <span style="color: Gray;">=</span> torch.<span style="color: #05a;">randn</span><span style="color: Olive;">(</span><span style="color: Maroon;">10</span><span style="color: Gray;">,</span> <span style="color: Maroon;">3</span><span style="color: Gray;">,</span> <span style="color: Maroon;">4</span><span style="color: Olive;">)</span> <span style="color: #a50"># 10 个 3x4 矩阵</span><br /> batch_b <span style="color: Gray;">=</span> torch.<span style="color: #05a;">randn</span><span style="color: Olive;">(</span><span style="color: Maroon;">10</span><span style="color: Gray;">,</span> <span style="color: Maroon;">4</span><span style="color: Gray;">,</span> <span style="color: Maroon;">5</span><span style="color: Olive;">)</span> <span style="color: #a50"># 10 个 4x5 矩阵</span><br /> <br /> <span style="color: #a50"># 批量矩阵乘法</span><br /> batch_c <span style="color: Gray;">=</span> torch.<span style="color: #05a;">matmul</span><span style="color: Olive;">(</span>batch_a<span style="color: Gray;">,</span> batch_b<span style="color: Olive;">)</span><br /> <br /> <span style="color: Green;font-weight:bold;">print</span><span style="color: Olive;">(</span><span style="color: #a11;">"批量 a 的形状:"</span><span style="color: Gray;">,</span> batch_a.<span style="color: #05a;">shape</span><span style="color: Olive;">)</span><br /> <span style="color: Green;font-weight:bold;">print</span><span style="color: Olive;">(</span><span style="color: #a11;">"批量 b 的形状:"</span><span style="color: Gray;">,</span> batch_b.<span style="color: #05a;">shape</span><span style="color: Olive;">)</span><br /> <span style="color: Green;font-weight:bold;">print</span><span style="color: Olive;">(</span><span style="color: #a11;">"批量结果 c 的形状:"</span><span style="color: Gray;">,</span> batch_c.<span style="color: #05a;">shape</span><span style="color: Olive;">)</span><br /> </div> </div> <p>输出结果为:</p> <pre> 批量 a 的形状: torch.Size([10, 3, 4]) 批量 b 的形状: torch.Size([10, 4, 5]) 批量结果 c 的形状: torch.Size([10, 3, 5])
バッチ行列積はディープラーニングで一般的な操作であり、例えば Transformer のアテンション機構などで使用されます。
例 4: ニューラルネットワークにおける行列積
例
import torch
# ニューラルネットワーク層をシミュレーション:入力 xW + b
x = torch.randn(32, 128) # バッチサイズ32、特徴次元128
W = torch.randn(128, 256) # 重み行列
b = torch.randn(256) # バイアスベクトル
# 線形変換:y = x @ W^T + b (PyTorch では通常 W は転置されます)
# ここでは x @ W を示します
y = torch.matmul(x, W) + b
print("入力 x の形状:", x.shape)
print("重み W の形状:", W.shape)
print("出力 y の形状:", y.shape)
# ニューラルネットワーク層をシミュレーション:入力 xW + b
x = torch.randn(32, 128) # バッチサイズ32、特徴次元128
W = torch.randn(128, 256) # 重み行列
b = torch.randn(256) # バイアスベクトル
# 線形変換:y = x @ W^T + b (PyTorch では通常 W は転置されます)
# ここでは x @ W を示します
y = torch.matmul(x, W) + b
print("入力 x の形状:", x.shape)
print("重み W の形状:", W.shape)
print("出力 y の形状:", y.shape)
出力結果は次のとおりです:
输入 x 形状: torch.Size([32, 128]) 权重 W 形状: torch.Size([128, 256]) 输出 y 形状: torch.Size([32, 256])
この例は、ニューラルネットワークにおける全結合層の順伝播プロセスをシミュレーションしています。
注意事項
torch.matmulブロードキャストをサポートしますが、2つの入力の最後の2つの次元は行列積の次元要件を満たす必要があります。- 2次元行列積には、次のものも使用できます
torch.mm()、ただしtorch.matmulより汎用的です。 - 区別に注意してください
torch.matmul(行列積)とtorch.mul(要素ごとの積)。
その他の拡張