优化器、训练与评估

PyTorch 深度学习进阶

Michal Oleszak

Machine Learning Engineer

训练循环

import torch.nn as nn
import torch.optim as optim

criterion = nn.BCELoss()
optimizer = optim.SGD(net.parameters(), lr=0.01)


for epoch in range(1000): for features, labels in dataloader_train:
optimizer.zero_grad()
outputs = net(features)
loss = criterion( outputs, labels.view(-1, 1) )
loss.backward()
optimizer.step()
  • 定义损失函数与优化器
    • 二分类用 BCELoss
    • 优化器用 SGD
  • 迭代轮次与训练批次
  • 清零梯度
  • 前向传播:得到输出
  • 计算损失
  • 反向传播:计算梯度
  • 优化步:更新参数
PyTorch 深度学习进阶

优化器的工作原理

 

两个长度为 2 的向量:一个为参数值(1 和 0.5),另一个为梯度(0.9 和 -0.2)。

PyTorch 深度学习进阶

优化器的工作原理

 

箭头表示将参数与梯度两个向量传入优化器(绘作靶盘)。

PyTorch 深度学习进阶

优化器的工作原理

 

一支箭从优化器指向包含两个参数更新的向量:-0.5 和 0.5。

PyTorch 深度学习进阶

优化器的工作原理

 

一支箭从参数更新指向更新后的参数值:0.5 和 1.0

PyTorch 深度学习进阶

优化器的工作原理

 

一支箭从参数更新指向更新后的参数值:0.5 和 1.0

PyTorch 深度学习进阶

随机梯度下降(SGD)

optimizer = optim.SGD(net.parameters(), lr=0.01)
  • 更新取决于学习率
  • 简单高效,适合基础模型
  • 实际中较少单独使用
PyTorch 深度学习进阶

自适应梯度(Adagrad)

optimizer = optim.Adagrad(net.parameters(), lr=0.01)
  • 为每个参数自适应学习率
  • 适合稀疏数据
  • 学习率可能衰减过快
PyTorch 深度学习进阶

均方根传播(RMSprop)

optimizer = optim.RMSprop(net.parameters(), lr=0.01)
  • 基于过往梯度大小为每个参数调整更新
PyTorch 深度学习进阶

自适应矩估计(Adam)

optimizer = optim.Adam(net.parameters(), lr=0.01)
  • 最通用且应用最广
  • 结合 RMSprop 与动量
  • 常作为默认选择
PyTorch 深度学习进阶

模型评估

from torchmetrics import Accuracy

acc = Accuracy(task="binary")


net.eval() with torch.no_grad(): for features, labels in dataloader_test:
outputs = net(features)
preds = (outputs >= 0.5).float()
acc(preds, labels.view(-1, 1))
accuracy = acc.compute() print(f"Accuracy: {accuracy}")
Accuracy: 0.6759443283081055
  • 设置准确率指标
  • 将模型置为评估模式,并在测试集上无梯度迭代
  • 前向计算预测概率
  • 计算预测标签
  • 更新准确率指标
PyTorch 深度学习进阶

开始练习吧!

PyTorch 深度学习进阶

Preparing Video For Download...