返回目录原地操作(带下划线
公开知识笔记 · 不进入目录
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 把差距拉大,最大值抢到最大权重
- 两步走:① 每个数取 e 的指数(
-
x.norm(dim=, keepdim=)—— 求范数(默认 L2,即长度)- 例:
X.norm(dim=1, keepdim=True)# 对每一行求长度,结果 (3,1),用于行归一化 - 过程:对第 dim 维求 L2范数 (平方和+开方);结果:若 keepdim=True,则 dim 维的维度数改为 1,否则
- 想象策略:
- 第 dim 维消失把
dim=1临时当成“行” - 把最后一维当成“列”
- 其他所有维度都当成“这是第几号表格/文件夹”
- 第 dim 维消失把
- 行归一化写法:
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 公式出现,照抄不背 ⚠️
被以下札记引用
2026-W33