本文档总结了 PyTorch 的核心概念和常用函数,内容源自
pytorch101.ipynb
1. Tensor (张量) 基础
Tensor 是 PyTorch 中的核心数据结构,类似于 NumPy 的 ndarray,但提供了 GPU 加速功能。
1.1 创建与访问
创建 Tensor
可以直接从 Python 列表创建 Tensor。
torch.tensor(list)
: 从列表创建张量。
Tensor 属性
.dim()
: 获取张量的维度(秩)。
.shape
或.size()
: 获取张量的形状。
访问与修改
- 使用方括号
[]
进行索引。
- 使用
.item()
将单个元素的 Tensor 转换为 Python 标量。
1.2 Tensor 构造函数
PyTorch 提供了多种函数来快速创建常用 Tensor。
torch.zeros(*size)
: 创建全零张量。
torch.ones(*size)
: 创建全一张量。
torch.eye(n)
: 创建一个 n x n 的单位矩阵。
torch.rand(*size)
: 创建在 [0, 1) 区间内均匀分布的随机数张量。
torch.full(size, fill_value)
: 创建一个指定大小并用fill_value
填充的张量。
torch.arange(start, end, step)
: 创建一个在[start, end)
范围内以step
为步长的序列。
1.3 数据类型 (dtype)
每个 Tensor 都有一个
dtype
。- 指定类型: 在创建时使用
dtype
参数,如dtype=torch.float32
。
- 转换类型: 使用
.to(dtype)
或便捷方法如.float()
(转为 float32),.long()
(转为 int64)。
常用类型包括:
torch.float32
(默认浮点), torch.int64
(默认整数), torch.bool
。2. Tensor 索引
2.1 切片索引
与 Python 列表和 NumPy 类似,使用
start:stop:step
进行切片。切片返回的是原 Tensor 的一个 视图 (view),修改切片会影响原 Tensor。注意: 使用整数索引会降低维度,而使用切片(即使长度为1)会保持维度。
若不想修改原 Tensor,使用
.clone()
创建副本。2.2 整数数组索引
使用整数列表或 Tensor 进行索引,可以灵活地构造新的 Tensor。
2.3 布尔索引
使用布尔类型的 Tensor 来选择或修改元素。
3. 变形操作
3.1 视图 (View) 与 Reshape
.view(*shape)
: 改变 Tensor 的形状,返回的是一个视图,与原 Tensor 共享数据。新旧 Tensor 的元素总数必须相同。
.reshape(*shape)
: 功能与.view()
类似,但更强大。如果 Tensor 不是连续的 (contiguous),.reshape()
会创建一个副本。通常推荐使用.reshape()
。
- 可以在形状参数中使用
1
,PyTorch 会自动计算该维度的大小。
3.2 交换维度
.t()
: 对二维 Tensor (矩阵) 进行转置。
.transpose(dim0, dim1)
: 交换指定的两个维度。
.permute(*dims)
: 对所有维度进行重排。
4. Tensor 运算
4.1 按元素运算
基础数学运算都是按元素进行的。
- 操作符:
+
, , ,/
,*
- torch 函数:
torch.add()
,torch.sub()
,torch.mul()
,torch.div()
,torch.pow()
- Tensor 方法:
.add()
,.sub()
,.mul()
,.div()
,.pow()
其他函数如
torch.sqrt()
, torch.sin()
, torch.cos()
也都是按元素运算。4.2 归约 (Reduction) 运算
对 Tensor 的全部或部分元素进行聚合计算。
.sum(dim=None)
: 求和。
.mean(dim=None)
: 求均值。
.min(dim=None)
: 求最小值。
.max(dim=None)
: 求最大值。
dim
参数: 指定要进行归约的维度。运算后,该维度会消失。
keepdim=True
: 在归约后保留该维度,大小变为 1。4.3 矩阵运算
torch.dot(vec1, vec2)
: 向量内积。
torch.mv(mat, vec)
: 矩阵-向量乘法。
torch.mm(mat1, mat2)
: 矩阵-矩阵乘法。
torch.bmm(batch1, batch2)
: 批处理矩阵-矩阵乘法。
torch.matmul(t1, t2)
: 通用乘法,根据输入维度执行不同操作 (点积,矩阵-向量,矩阵-矩阵)。
4.4 广播 (Broadcasting)
广播是一种强大的机制,允许 PyTorch 在执行算术运算时处理不同形状的张量。
规则核心:
- 如果两个 Tensor 的维度不同,在较低维度的 Tensor 前面补 1,直到维度数相同。
- 在每个维度上,如果两个 Tensor 的大小相同,或者其中一个为 1,则它们是兼容的。
- 如果所有维度都兼容,则可以广播。
- 广播后,每个 Tensor 的形状都等于两个输入 Tensor 形状的逐元素最大值。
- 在大小为 1 的维度上,Tensor 会被复制以匹配另一个 Tensor 的大小。
示例:将向量加到矩阵的每一行
示例:将向量加到矩阵的每一列
5. 在 GPU 上运行
PyTorch 可以利用 CUDA-enabled GPU 进行加速。
- 检查 GPU 是否可用:
torch.cuda.is_available()
- 移动 Tensor 到 GPU:
.to('cuda')
或.cuda()
- 移动 Tensor 回 CPU:
.to('cpu')
或.cpu()
- 直接在 GPU 上创建:
torch.tensor(..., device='cuda')
注意: 参与运算的所有 Tensor 必须在同一个设备上 (要么都在 CPU,要么都在同一个 GPU)。在计时 GPU 运算时,使用
torch.cuda.synchronize()
来确保运算完成。