训练循环详解
模型训练流程¶
| 概念 | 类比 | 功能 | 数学表示 | 常见类型/示例 |
|---|---|---|---|---|
| 前向传播 | 信息流动 | 从输入到输出的计算过程 | - | - |
| 损失函数 | 误差衡量 | 衡量预测值与真实值之间的差异, 训练的目标是**最小化损失函数** | 均方误差(MSE), 交叉熵损失(Cross-Entropy Loss)等 | - |
| 反向传播 | 计算梯度 | 应用链式法则进行求导的过程, 最终目的是计算出**损失函数对每层参数的梯度** | - | - |
| 优化器 | 参数更新工具 | 根据梯度**更新参数** | **SGD, Adam, RMSprop, Adagrad**等 | - |
前向传播,得出结果 -> 对比答案, 计算损失 -> 反向传播, 获得梯度 -> 使用optimizer, 更新模型参数
Python
model = Net()
optimizer = optim.Adam(model.parameters())
for epoch in range(epochs):
# 1. 前向传播
<div markdown="1" style="margin-top: -30px; font-size: 0.75em; opacity: 0.7;">
:material-circle-edit-outline: 约 194 个字 :fontawesome-solid-code: 48 行代码 :material-clock-time-two-outline: 预计阅读时间 1 分钟
</div>
output = model(data)
loss = criterion(output, target)
# 2. 清零梯度
optimizer.zero_grad()
# 3. 反向传播: 计算梯度
loss.backward()
# output.backward(torch.ones_like(output))
# 4. 优化器: 更新参数
optimizer.step()
gpu训练¶
Python
net = Net()
if torch.cuda.is_available():
net = net.cuda()
loss_fn = nn.CrossEntropyLoss()
if torch.cuda.is_available():
loss_fn = loss_fn.cuda()
if torch.cuda.is_available():
inputs = inputs.cuda()
labels = labels.cuda()
torch.cuda.device_count()
模型保存加载¶
Python
import torch
import torchvision
# method1
vgg16 = torchvision.models.vgg16(weights=True)
torch.save(vgg16, '/app/output/vgg16.pth')
model = torch.load('/app/output/vgg16.pth', weights_only=False)
print(model)
# method2
torch.save(net.state_dict(), 'mlp.params')
clone = MLP()
clone.load_state_dict(torch.load('mlp.params'))