本文档总结了 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 在执行算术运算时处理不同形状的张量。
规则核心:
  1. 如果两个 Tensor 的维度不同,在较低维度的 Tensor 前面补 1,直到维度数相同。
  1. 在每个维度上,如果两个 Tensor 的大小相同,或者其中一个为 1,则它们是兼容的。
  1. 如果所有维度都兼容,则可以广播。
  1. 广播后,每个 Tensor 的形状都等于两个输入 Tensor 形状的逐元素最大值。
  1. 在大小为 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() 来确保运算完成。
Loading...