一、 概述
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()方法的使用要求我们对输入和输出的形状有一定的了解,但只要掌握了这些基本方法,我们就能够构建复杂的模型和算法。