Функция torch.matmul в PyTorch
Справочное руководство Pytorch torch
torch.matmulЭто функция в PyTorch, используемая для выполнения матричного умножения. Она поддерживает входные данные разных размерностей и может обрабатывать умножение одномерных, двумерных и многомерных тензоров.
Это одна из наиболее часто используемых операций в глубоком обучении. Прямое распространение нейронной сети по сути представляет собой последовательность матричных умножений.
Определение функции
torch.matmul(input, other, out=None)
Parameters:
input(Tensor): первый входной тензор.other(Tensor): Второй входной тензор.out(Tensor, необязательный): Выходной тензор.
Возвращаемое значение:
torch.Tensor: Возвращает результат умножения матриц.
Примеры использования
Пример 1: Двумерное матричное умножение
Пример
import torch
# Создайте две 2D-матрицы
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)
# Создайте две 2D-матрицы
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])
Батчевое матричное умножение — распространённая операция в глубоком обучении, например, в механизме внимания трансформеров.
Пример 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Поддерживается широковещание, но последние два измерения обоих входов должны удовлетворять требованиям к размерности матричного умножения.- Для двумерного матричного умножения также можно использовать
torch.mm(), ноtorch.matmulявляется более общим. - Обратите внимание на разницу между
torch.matmul(матричное умножение) иtorch.mul(поэлементное умножение).
Другие расширения