返回目录
公开知识笔记 · 不进入目录

PyTorch 常用语法速查

公开知识笔记

PyTorch 常用语法速查

本文由 Self_study/Ai/安九/常用代码.ipynb 及 FPS-MGCN 构图代码二次整理而来,按用途分类,随查随用。

1. 导入

import torch
import torch.nn as nn

2. 张量创建

  • torch.zeros_like(x) —— 生成和 x 形状一样的全 0 矩阵
    • 例:A = torch.zeros_like(sim) # 造一个和 sim 同形状的全 0 矩阵,准备往里填邻接边
  • torch.ones_like(x) —— 生成和 x 形状一样的全 1 矩阵
    • 例:mask = torch.ones_like(x) # 同形状全 1

3. 张量形状:查看与变换

查看形状

  • q.shape / q.size() —— 查看张量形状
  • q.shape[i] —— 取第 i 维的大小(如 q.shape[0] 是 batch 大小)

调整维度

  • q.view(...) —— 调整维度,不改变数据,要求内存连续
  • q.reshape(...) —— 调整维度,更宽松,必要时会复制数据
  • q.unsqueeze(dim=) —— 在指定位置插入一个大小为 1 的新维度,数据不变,shape 改变
  • q.transpose(dim0, dim1) / torch.transpose(tensor, dim0, dim1) —— 交换两个维度
    • 例:q.transpose(2, 3) 交换第 2、3 维

转置

  • x.T —— 转置,(3,2) 变 (2,3)
    • 例:Xn.T # (3,2) 转成 (2,3),用于 Xn @ Xn.T 算相似度

4. 数学运算

  • torch.matmul(a, b) —— 矩阵乘法

  • a @ b —— 矩阵乘法的简写(Python 3.5+),等价于 torch.matmul(a, b)

    • 例:sim = Xn @ Xn.T # (3,2)@(2,3) -> (3,3)
  • torch.sum(t, dim=, keepdim=) —— 沿指定维度求和

    • 例:torch.sum(o5 * o7, dim=1, keepdim=True) [b,n] -> [b,1]
    • dim=1 表示对第 1 维求和;keepdim=True 保留维度,否则维度被压掉([b,n] -> [b])
  • torch.softmax(t, dim=) —— 把一串数变成「概率」(每个数 0~1,加起来 = 1)

    • 两步走:① 每个数取 e 的指数(torch.exp,都变正数、差距放大)② 除以总和(归一化成百分比)
    • 例:[2.0, 1.0, 0.1] → exp → [7.39, 2.72, 1.11] → 除总和 11.22 → [0.66, 0.24, 0.10](和 = 1)
    • dim 含义:哪一组数要加起来等于 1。softmax(x, dim=1) = 每个「样本」内部沿第 1 维归一化
    • 关键直觉:不是平均分,是「谁大谁占大头」——exp 把差距拉大,最大值抢到最大权重
  • x.norm(dim=, keepdim=) —— 求范数(默认 L2,即长度)

    • 例:X.norm(dim=1, keepdim=True) # 对每一行求长度,结果 (3,1),用于行归一化
    • 过程:对第 dim 维求 L2范数 (平方和+开方);结果:若 keepdim=True,则 dim 维的维度数改为 1,否则
    • 想象策略:
      • 第 dim 维消失把 dim=1 临时当成“行”
      • 把最后一维当成“列”
      • 其他所有维度都当成“这是第几号表格/文件夹”
    • 行归一化写法:Xn = X / (X.norm(dim=1, keepdim=True) + 1e-8) # +1e-8 防除零
  • torch.topk(x, k, dim=) —— 沿指定维度取最大的 k 个,返回命名元组 .values(值)和 .indices(索引)

    • 例:topk = torch.topk(sim, 2, dim=1) # 每行取最大 2 个;topk.indices 是它们的列索引
  • torch.clamp(input, min, max) —— 逐元素将张量值限制在 [min, max] 区间内

    • 例:torch.clamp(F.softplus(x), 1e-4, 1e4) # 防止 ZINB 参数溢出或梯度爆炸
    • 注意:超出边界时梯度为 0,上下界需根据数据实际范围设定,不可随意填写

5. 距离计算

  • torch.cdist(x1, x2) —— 两组点两两欧氏距离,(N,2) -> (N,N)
    • 例:dist = torch.cdist(coords, coords) # dist[i][j] = 第 i 点到第 j 点的距离,对角线是 0

6. 比较与掩码

  • (t <= r) —— 比较运算符,逐元素判断,得到布尔张量(True/False)

    • 例:(dist <= 2) # 每个元素判断是否 ≤2,得到 True/False 矩阵
  • .float() —— 转浮点型;对布尔张量:True -> 1.0,False -> 0.0

    • 例:A = (dist <= r).float() # 距离 ≤r 的位置变成 1,其余 0,得到 0/1 邻接矩阵
  • t.masked_fill(mask == 0, val) —— 把 mask 为 0(False)的位置填成 val

    • 例:scores = scores.masked_fill(mask == 0, -1e9) # 屏蔽 padding 位置,softmax 后权重趋近 0

7. 对角线操作

  • torch.diag(A) —— 两种用法:输入矩阵 → 取对角线成一维向量;输入向量 → 构对角方阵

    • 例:A - torch.diag(torch.diag(A)) # 对角线置 0(去掉自环)的写法
  • A.fill_diagonal_(0) —— 更简洁地直接把对角线置 0(原地)

    • 例:A.fill_diagonal_(0) # 等价于上面那行,去掉自环

8. 按索引填充

  • A.scatter_(dim, index, src) —— 原地操作,沿 dim 维按 index 给的位置填入 src
    • 例:A.scatter_(1, topk.indices, 1.0) # 每行在 topk.indices 给的列位置填 1.0

9. 拼接

  • torch.cat(tensors, dim) —— 沿指定维度拼接张量
    • 例:embed = torch.cat([e_embed, r_embed], dim=1)
    • [B, 1, 256] + [B, 1, 256] -> [B, 2, 256]

10. 搭建网络

nn.Sequential:顺序堆叠层

nn.Sequential(
    nn.Linear(in_dim, out_dim),
    nn.ReLU(),
    nn.Linear(out_dim, out_dim),
    ...
)

自定义模型骨架(两个必背语法)

  • class X(nn.Module) —— 自定义网络层,继承 nn.Module 基类。所有自己写的模型/层都以这一行开头。⭐⭐⭐
  • super().__init__() —— 调用父类 nn.Module 的初始化,让 PyTorch 接管参数登记。每个 __init__ 的第一行固定照抄。⭐⭐⭐
class MyModel(nn.Module):            # 继承 nn.Module(不是 nn.Model)
    def __init__(self):
        super().__init__()            # 固定第一行,调用父类初始化
        self.fc = nn.Sequential(      # 注意 nn.Sequential(大写 S)
            nn.Linear(in_dim, out_dim),  # Linear 必须写输入/输出维度
            nn.ReLU(),                    # 注意是 nn.ReLU(大写 LU)
            nn.Linear(out_dim, out_dim),
            ...
        )

    def forward(self, x):
        return self.fc(x)

11. 通用概念

广播机制(broadcasting)

形状不同的张量做运算时,PyTorch 会自动把较小的张量沿缺失维度「复制扩展」到匹配。

  • 例:X / X.norm(dim=1, keepdim=True) # (3,2) / (3,1),(3,1) 自动沿列扩成 (3,2) 再逐元素除

原地操作(带下划线 _)

方法名带 _ 的是原地操作,直接修改原张量本身,不返回新变量。

  • 例:A.scatter_(...)、A.fill_diagonal_(0) # 都直接改 A 本身,不需要重新赋值
  • 对比:不带 _ 的版本(如 A.scatter(...))返回新张量,原 A 不变。

12. 速查对照表

需求 写法 一句话例子
查看形状 q.shape / q.size() q.shape[0] 取 batch 大小
调整维度 q.view() / q.reshape() q.reshape(3, -1) 自动算第二维
加一个 1 维度 q.unsqueeze(dim) q.unsqueeze(0) 加 batch 维
交换维度 q.transpose(2, 3) q.transpose(1, 2)
转置 x.T Xn.T 变 (2,3)
矩阵乘法 a @ b / torch.matmul(a, b) Xn @ Xn.T 算相似度
求和 torch.sum(t, dim, keepdim) torch.sum(x, dim=1, keepdim=True)
求范数/行归一化 x.norm(dim=, keepdim=) X / (X.norm(dim=1, keepdim=True) + 1e-8)
取 top-k torch.topk(x, k, dim) torch.topk(sim, 2, dim=1).indices
归一化 torch.softmax(t, dim) torch.softmax(x, dim=-1)
两两距离 torch.cdist(x1, x2) torch.cdist(coords, coords)
布尔转 0/1 (t <= r).float() (dist <= r).float()
掩码填充 t.masked_fill(mask == 0, val) scores.masked_fill(mask == 0, -1e9)
对角线置 0 A.fill_diagonal_(0) 去掉自环
按索引填充 A.scatter_(dim, index, src) A.scatter_(1, topk.indices, 1.0)
拼接 torch.cat(tensors, dim) torch.cat([a, b], dim=1)
同形状全 0 torch.zeros_like(x) torch.zeros_like(sim)
顺序堆叠层 nn.Sequential(...) nn.Sequential(nn.Linear(10, 5), nn.ReLU())
自定义网络 class X(nn.Module) 见下方骨架

13. 网络层(阶段 4 新增)

  • nn.Linear(in_dim, out_dim) —— 线性层,必填输入/输出维度,内部自动建权重+偏置 ⭐⭐⭐
    • 例:self.fc = nn.Linear(100, 32) # 100 维输入 → 32 维输出
  • F.relu(x) —— ReLU 激活,max(0, x),正数保留负数变 0 ⭐⭐⭐
    • 例:h = F.relu(self.gc1(X, A))
  • nn.Tanh() —— Tanh 激活层,把值压到 (-1, 1) ⭐

14. 训练循环(阶段 5 新增,必背固定模板)

optimizer = torch.optim.Adam(model.parameters(), lr=1e-3)
for epoch in range(200):
    out = model(...)
    loss = ...
    optimizer.zero_grad()   # 清梯度(不能省,否则累积)
    loss.backward()         # 反向传播算梯度
    optimizer.step()        # 更新参数
  • torch.optim.Adam(params, lr=) —— Adam 优化器,最常用 ⭐⭐⭐
  • optimizer.zero_grad() —— 清零梯度 ⭐⭐⭐
  • loss.backward() —— 反向传播 ⭐⭐⭐
  • optimizer.step() —— 按梯度更新参数 ⭐⭐⭐
  • model.parameters() —— 取模型所有可训练参数 ⭐⭐

15. 其他常用(阶段 2-3 新增)

  • torch.eye(n) —— n×n 单位矩阵(对角线 1) ⭐⭐
    • 例:A + torch.eye(A.shape[0]) # 加自环
  • tensor.pow(x) —— 每个元素求 x 次方 ⭐⭐
    • 例:D.pow(-0.5) # 1/√D
  • tensor.mean() —— 求平均 ⭐⭐⭐
  • torch.log(x) —— 逐元素对数 ⭐⭐
  • torch.cos(x) / torch.sin(x) —— 逐元素三角 ⭐⭐
  • torch.randn(a, b) —— 标准正态随机张量(造随机数据 / 随机初始化权重) ⭐⭐⭐
  • torch.pi —— π 常量 ⭐
  • nn.Parameter(t) —— 把张量注册成可训练参数 ⭐⭐

16. 生僻语法(认识即可,写代码避开)

  • torch.FloatTensor(a, b) —— 未初始化随机矩阵(值不确定),用 nn.Linear 或 torch.randn 替代 ⚠️
  • torch.lgamma(x) —— log Γ(x)(阶乘连续版的对数),只在 ZINB 公式出现,照抄不背 ⚠️
PyTorch 常用语法速查|每周札记