本文通过代码示例详细讲解PyTorch中常用的线性代数操作,包括点积、矩阵乘法、范数计算以及按轴求和等操作,帮助读者掌握张量运算的核心方法。
1. 点积运算
点积(Dot Product)是两个向量对应元素相乘后求和的结果。
实现代码:
import torch
x = torch.tensor([0, 1, 2, 3], dtype=torch.float32)
y = torch.ones(4, dtype=torch.float32)
x, y, torch.dot(x, y) # 计算点积
输出结果:
(tensor([0., 1., 2., 3.]), tensor([1., 1., 1., 1.]), tensor(6.))
等价实现方式:
torch.sum(x * y) # 通过逐元素乘法和求和实现点积
输出:
tensor(6.)
2. 矩阵与向量乘法
使用 torch.mv
实现矩阵与向量的乘法。
代码示例:
x = torch.arange(12).reshape((3, 4)).float()
y = torch.ones(4, dtype=torch.float32)
x.shape, y.shape, torch.mv(x, y) # 矩阵形状、向量形状及乘法结果
输出:
(torch.Size([3, 4]), torch.Size([4]), tensor([ 6., 22., 38.]))
3. 矩阵与矩阵乘法
使用 torch.mm
实现矩阵与矩阵的乘法。
代码示例:
b = torch.ones(4, 3).float()
torch.mm(x, b) # 3x4矩阵与4x3矩阵相乘
输出:
tensor([[ 6., 6., 6.],
[22., 22., 22.],
[38., 38., 38.]])
4. 范数计算
L2范数(欧几里得范数)
torch.norm(y) # 计算向量y的L2范数
输出:
tensor(2.)
L1范数(绝对值之和)
torch.abs(y).sum() # 计算向量y的L1范数
输出:
tensor(4.)
Frobenius范数(矩阵范数)
torch.norm(x) # 计算矩阵x的F范数
输出:
tensor(22.4944)
5. 按轴求和
沿指定轴求和并保留维度
sum_x = x.sum(axis=0, keepdim=True) # 沿水平方向求和,保留维度
sum_x
输出:
tensor([[12., 15., 18., 21.]])
三维张量的轴求和
a = torch.ones((2, 5, 4))
a.shape # 初始形状
输出:
torch.Size([2, 5, 4])
对多个轴求和
a.sum(axis=[0, 2], keepdim=True).shape # 沿第0和第2轴求和
输出:
torch.Size([1, 5, 1])
单轴求和保留维度
a.sum(axis=1, keepdim=True).shape # 沿第1轴求和并保留维度
输出:
torch.Size([2, 1, 4])
总结
本文演示了PyTorch中常用的线性代数操作,包括:
点积:
torch.dot
或逐元素乘法后求和;矩阵乘法:
torch.mv
(矩阵与向量)、torch.mm
(矩阵与矩阵);范数计算:L1、L2和Frobenius范数;
轴求和:通过
sum(axis)
控制求和方向,keepdim
保留维度。
这些操作是深度学习模型实现的基础,熟练掌握可提升张量运算的效率和代码可读性。