爱站工具的功能,兰州 网站建设公司,南华大学城市建设学院网站,手机如何制作图片前一篇文章#xff0c;深度学习里面的而优化函数 Adam#xff0c;SGD#xff0c;动量法#xff0c;AdaGrad 等 | PyTorch 深度学习实战
本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started
本篇文章内容来自于 强化学习必修课#xff1a;引…前一篇文章深度学习里面的而优化函数 AdamSGD动量法AdaGrad 等 | PyTorch 深度学习实战
本系列文章 GitHub Repo: https://github.com/hailiang-wang/pytorch-get-started
本篇文章内容来自于 强化学习必修课引领人工智能新时代【梗直哥瞿炜】 PyTorch 学习率调整策略 常见的学习率调节器学习率衰减指数衰减余弦学习率调节预热 示例程序执行结果没有使用学习率自动调节时使用了学习率自动调节结论 常见学习率调节器Links 常见的学习率调节器 学习率衰减 指数衰减 余弦学习率调节
实现学习率循环降低或升高的效果 预热 示例程序
下面以指数衰减调节器ExponentialLR为例子展示同样的数据条件下不衰减学习率和衰减学习率两种情况下损失函数loss的收敛情况。
import torch
torch.manual_seed(777)
Learning rate schedulerimport matplotlib.pyplot as plt
import numpy as np
import torch.nn as nn
from torch.utils.data import DataLoader, TensorDataset # 构造数据集加载器
from torch.utils.data import random_split # 划分数据集torch.manual_seed(777)# for reproducibility为了重复使用############################
# 生成数据
############################# 定义函数
def f(x,y):return x**2 2*y**2# 定义初始值
num_samples 1000 # 1000 个样本点
X torch.rand(num_samples) # 均匀分布
Y torch.rand(num_samples)
Z f(X,Y) 3 * torch.randn(num_samples)# Concatenates a sequence of tensors along a new dimension.
# All tensors need to be of the same size.
# https://pytorch.org/docs/stable/generated/torch.stack.html
dataset torch.stack([X,Y,Z], dim1)
# print(dataset.shape) # torch.Size([1000, 3])# split data, 按照 7:3 划分数据集
train_size int(0.7 * len(dataset))
test_size len(dataset) - train_sizetrain_dataset, test_dataset random_split(datasetdataset, lengths[train_size, test_size])# 将数据封装为数据加载器
# narrow 函数对数据进行切片操作
#
train_dataloader DataLoader(TensorDataset(train_dataset.dataset.narrow(1,0,2), train_dataset.dataset.narrow(1,2,1)), batch_size32, shuffleFalse)
test_dataloader DataLoader(TensorDataset(test_dataset.dataset.narrow(1,0,2), test_dataset.dataset.narrow(1,2,1)), batch_size32, shuffleFalse)############################
# 模型定义
############################# 定义一个简单的模型
class Model(nn.Module):def __init__(self):super().__init__()self.hidden nn.Linear(2, 8)self.output nn.Linear(8, 1)def forward(self, x):x torch.relu(self.hidden(x))return self.output(x)############################
# 模型训练
############################# 超参数
num_epochs 100
learning_rate 0.1 # 学习率调大一些更直观# 定义损失函数
loss_fn nn.MSELoss()# 通过两次训练对比有无调节器的效果
for with_scheduler in [False, True]:# 定义训练和测试误差数组train_losses []test_losses []# 初始化模型model Model()# 定义优化器optimizer torch.optim.SGD(model.parameters(), lr learning_rate)# 定义学习率调节器scheduler torch.optim.lr_scheduler.ExponentialLR(optimizeroptimizer, gamma0.99)# 迭代训练for epoch in range(num_epochs):# 设定模型工作在训练模式model.train()train_loss 0# 遍历训练集for inputs, targets in train_dataloader:# 预测、损失函数、反向传播optimizer.zero_grad()outputs model(inputs)loss loss_fn(outputs, targets)loss.backward()optimizer.step()# 记录 losstrain_loss loss.item()# 计算 loss 并记录到训练误差train_loss / len(train_dataloader)train_losses.append(train_loss)# 在测试数据集上评估model.eval()test_loss 0with torch.no_grad():# 遍历测试集for inputs, targets in test_dataloader:# 预测、损失函数outputs model(inputs)loss loss_fn(outputs, targets)# 记录 losstest_loss loss.item()# 计算 loss 并记录到测试误差test_loss / len(test_dataloader)test_losses.append(test_loss)# 是否更新学习率if with_scheduler:scheduler.step()# 绘制训练和测试误差曲线plt.figure(figsize (8, 4))plt.plot(range(num_epochs), train_losses, labelTrain)plt.plot(range(num_epochs), test_losses, labelTest)plt.title({0} lr_scheduler.format(With if with_scheduler else Without))plt.legend()# plt.ylim((1,2))plt.show()执行结果
没有使用学习率自动调节时 使用了学习率自动调节 结论
使用了学习率自动调节学习的速度更快收敛速度更快。
常见学习率调节器
## 学习率衰减例如每训练 100 次就将学习率降低为原来的一半
scheduler torch.optim.lr_scheduler.StepLR(optimizeroptimizer, step_size100, gamma0.5)
## 指数衰减法每次迭代将学习率乘上一个衰减率
scheduler torch.optim.lr_scheduler.ExponentialLR(optimizeroptimizer,gamma0.99)
## 余弦学习率调节optimizer 初始学习率为最大学习率eta_min 是最小学习率T_max 是最大的迭代次数
scheduler torch.optim.lr_scheduler.CosineAnnealingLR(optimizeroptimizer, T_max100, eta_min0.00001)
## 自定义学习率通过一个 lambda 函数自定义实现学习率调节器
scheduler torch.optim.lr_scheduler.LambdaLR(optimizeroptimizer, lr_lambdalambda epoch: 0.99 ** epoch)
## 预热
warmup_steps 20
scheduler torch.optim.lr_scheduler.LambdaLR(optimizeroptimizer, lr_lambdalambda t: min(t/warmup_steps, 0.001))Links
PyTorch学习率调整策略.ipynb6.2 动态调整学习率【学习率】torch.optim.lr_scheduler学习率10种调整方法整理11.11. 学习率调度器Pytorch – 手动调整学习率以及使用torch.optim.lr_scheduler调整学习率