您的位置:

PyTorch中的torch.matmul()

一、 概述

torch.matmul(input, other, *, out=None) 对矩阵或向量进行乘法运算,返回结果矩阵。

二、 用法

1. 用法示例

import torch

A = torch.randn(2, 3)
B = torch.randn(3, 4)

# 结果矩阵为 (2, 4)
C = torch.matmul(A, B)
print(C)

2. 参数说明

input(tensor): 输入的矩阵或者向量

other(tensor): 另一个矩阵或向量

out(tensor, optional): 输出结果矩阵

3. 注意事项

输入矩阵的最后一维的大小必须与另一个矩阵的倒数第二维相等。input为二维矩阵或高维张量时被视为堆叠的向量序列。另一个变量与输入张量的积将被计算。注意:等价于调用torch.mm(),但maxtrix1和matrix2都必须是2D张量,而matmul则支持张量任意数量的维度,矩阵乘法将在后两个维度中,这有助于通过广播多个矩阵。这里用一个例子来解释:如果我们有一个形状为(3,3,4)的三维矩阵和一个形状为(4,5)的二维矩阵,并希望对前两个维度执行矩阵乘法,则可以对这两个矩阵分别使用transpose和reshape方法。

三、 应用

1. 线性回归

在机器学习中,线性回归是一个基础的模型。简单的可以使用矩阵运算来实现,例如:

import matplotlib.pyplot as plt
import torch
from torch.nn import Linear

# 确定输入和输出的维度
x = torch.randn(100, 1) * 10
y = x + torch.randn(100, 1) * 3

# 定义模型
model = Linear(in_features=1, out_features=1)

# 定义损失函数
loss_func = torch.nn.MSELoss()

# 定义优化器
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)

# 训练100次
for i in range(100):
    y_pred = model(x)
    loss = loss_func(y_pred, y)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

plt.scatter(x, y)
plt.plot(x, y_pred.detach().numpy(), 'r')
plt.show()
在每次训练中,我们首先使用模型得到预测值,然后计算损失函数并更新优化器。这一部分可以使用matmul轻松实现。在我们的例子中,输入x和模型权重将通过matmul方法相乘。

2. 卷积运算

卷积运算是在深度学习中使用广泛的一种运算。我们可以使用matmul方法实现自定义卷积层。这里给出一个简单的例子:

import torch
import torch.nn.functional as F

# 定义自定义卷积层
class ConvLayer(torch.nn.Module):
    def __init__(self):
        super(ConvLayer, self).__init__()

        # 定义卷积核
        self.filter = torch.randn((3, 3, 3)) / 9
        self.filter.requires_grad = True

    def forward(self, x):
        # 将x切分成大小为3的窗口
        patches = x.unfold(2, 3, 1).unfold(3, 3, 1)

        # 将窗口展开成大小为(1, 3*3*3)的向量
        patches = patches.reshape((-1, 3*3*3))

        # 与卷积核相乘
        conv = torch.matmul(patches, self.filter.reshape(-1, 1))

        # 将结果转换回卷积层形状
        conv = conv.reshape(conv.shape[:-1] + (x.shape[2] - 2, x.shape[3] - 2))

        return F.relu(conv)

# 测试自定义卷积层
layer = ConvLayer()
x = torch.randn(1, 3, 5, 5)
y = layer(x)

print(y.shape)
在这个例子中,x通过使用展开和矩阵乘法与卷积核相乘。然后,我们将结果转换回原始形状,以获得输出。这种方法相对于使用卷积实现的方法来说,可能会慢一些,但是如果我们希望实现一个非常特殊的数据处理操作,这种方法还是很有用的。

四、小结

在PyTorch中,torch.matmul()是一个非常重要的方法,我们可以利用它进行矩阵乘法运算。在机器学习中,线性回归和卷积层都是使用matmul方法的常见应用案例。matmul()方法的使用要求我们对输入和输出的形状有一定的了解,但只要掌握了这些基本方法,我们就能够构建复杂的模型和算法。