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