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
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐