PyTorch 开发中 的一些概念
·
PyTorch 开发中 的一些概念
flyfish
最后代码示例说明
1. 模型内部状态类(模型本身的组成部分)
| 中文 | 英文 | PyTorch 对应形式 | 说明 |
|---|---|---|---|
| 参数 | Parameter | nn.Parameter / model.parameters() |
所有可训练张量的统称,包含权重、偏置等,会被优化器更新 |
| 权重 | Weight | 层的 .weight 属性 |
参数的核心子集,层间连接的系数矩阵/张量 |
| 偏置 | Bias | 层的 .bias 属性 |
参数的子集,层的偏移向量 |
| 缓冲区 | Buffer | register_buffer() / model.buffers() |
不可训练、但需要随模型保存的状态张量(如BatchNorm的滑动均值) |
| 状态字典 | State Dict | model.state_dict() |
包含所有参数+缓冲区的有序字典,用于模型保存与加载 |
| 模块 | Module | nn.Module |
神经网络的基础单元,网络层、完整模型都继承自它 |
2. 超参数类(训练前人工设定,不参与梯度更新)
| 中文 | 英文 | 常见形式 | 说明 |
|---|---|---|---|
| 超参数 | Hyperparameter | 手动定义的变量 | 所有训练配置的统称,决定模型结构与训练过程 |
| 学习率 | Learning Rate (lr) | 优化器的lr参数 |
参数更新的步长,最核心的超参数之一 |
| 批次大小 | Batch Size | DataLoader的batch_size |
单次迭代输入的样本数量 |
| 训练轮次 | Epoch | 训练循环的外层次数 | 完整遍历一遍训练集称为一个轮次 |
| 隐藏层维度 | Hidden Dimension | 层的out_features等 |
决定网络结构大小的配置 |
3. 训练流程类
| 中文 | 英文 | PyTorch 对应形式 | 说明 |
|---|---|---|---|
| 张量 | Tensor | torch.Tensor |
PyTorch的基础数据载体,类似多维数组 |
| 损失函数 | Loss Function / Criterion | nn.CrossEntropyLoss等 |
计算预测值与真实值的偏差 |
| 优化器 | Optimizer | torch.optim.Adam等 |
根据梯度更新模型参数的算法 |
| 梯度 | Gradient | param.grad |
损失函数对参数的导数,反向传播后生成 |
| 反向传播 | Backpropagation | loss.backward() |
自动计算所有参数梯度的过程 |
| 迭代 | Iteration | 内层循环的单次步骤 | 一个batch的训练过程,对应一次参数更新 |
| 计算图 | Computational Graph | 自动构建 | 记录张量运算流程,支撑自动求导机制 |
代码示例
import torch
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset
# ===================== 【超参数 Hyperparameter】=====================
# 全部为人工预先设定,不会被训练过程自动更新
batch_size = 32 # 批次大小 Batch Size
lr = 0.001 # 学习率 Learning Rate
epochs = 5 # 训练轮次 Epoch
input_dim = 10 # 输入维度
hidden_dim = 20 # 隐藏层维度 Hidden Dimension
output_dim = 3 # 输出类别数
# ===================== 构造模拟数据 =====================
# 张量 Tensor:PyTorch的基础数据单元
x = torch.randn(1000, input_dim) # 1000个样本,每个10维特征
y = torch.randint(0, output_dim, (1000,)) # 类别标签
dataset = TensorDataset(x, y)
# 按批次打包数据
dataloader = DataLoader(dataset, batch_size=batch_size, shuffle=True)
# ===================== 定义模型(Module)=====================
class SimpleNet(nn.Module): # 所有网络都继承 nn.Module(模块)
def __init__(self, input_dim, hidden_dim, output_dim):
super().__init__()
# 线性层内部包含 weight(权重)和 bias(偏置),都属于 parameter(参数)
self.linear1 = nn.Linear(input_dim, hidden_dim)
self.relu = nn.ReLU()
self.linear2 = nn.Linear(hidden_dim, output_dim)
# 注册 buffer(缓冲区):不可训练,但随模型持久化保存
self.register_buffer('scale', torch.tensor(1.0))
def forward(self, x):
# 前向传播过程会自动构建 计算图(Computational Graph)
x = self.linear1(x)
x = self.relu(x)
x = self.linear2(x)
return x * self.scale
# 实例化模型
model = SimpleNet(input_dim, hidden_dim, output_dim)
# 查看模型内部的参数与缓冲区
print("=== 所有可训练参数 Parameter ===")
for name, param in model.named_parameters():
print(f"{name}: 形状{param.shape},可训练:{param.requires_grad}")
print("\n=== 所有缓冲区 Buffer ===")
for name, buf in model.named_buffers():
print(f"{name}: 形状{buf.shape},可训练:{buf.requires_grad}")
# ===================== 训练组件 =====================
# 损失函数(Loss Function / Criterion)
criterion = nn.CrossEntropyLoss()
# 优化器(Optimizer):接收模型参数,用于梯度更新
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
# ===================== 训练循环 =====================
for epoch in range(epochs): # 外层循环:轮次 Epoch
total_loss = 0.0
for batch_x, batch_y in dataloader: # 内层循环:单次迭代 Iteration
# 1. 前向传播,计算预测值
pred = model(batch_x)
# 2. 计算损失 Loss
loss = criterion(pred, batch_y)
# 3. 梯度清零(避免累积)
optimizer.zero_grad()
# 4. 反向传播 Backpropagation:自动计算所有参数的梯度 Gradient
loss.backward()
# 5. 优化器更新参数 Parameter
optimizer.step()
total_loss += loss.item()
print(f"Epoch {epoch+1}/{epochs},平均损失:{total_loss/len(dataloader):.4f}")
# ===================== 模型保存(基于 State Dict)=====================
# state_dict 包含所有 parameter + buffer
torch.save(model.state_dict(), "model_weights.pth")
输出
=== 所有可训练参数 Parameter ===
linear1.weight: 形状torch.Size([20, 10]),可训练:True
linear1.bias: 形状torch.Size([20]),可训练:True
linear2.weight: 形状torch.Size([3, 20]),可训练:True
linear2.bias: 形状torch.Size([3]),可训练:True
=== 所有缓冲区 Buffer ===
scale: 形状torch.Size([]),可训练:False
Epoch 1/5,平均损失:1.1173
Epoch 2/5,平均损失:1.1074
Epoch 3/5,平均损失:1.1018
Epoch 4/5,平均损失:1.0968
Epoch 5/5,平均损失:1.0945
更多推荐

所有评论(0)