做网络推广网站有哪些,做夏促的网站有哪些,做电子手环网站需求分析,网站开发好就业吗同学你好#xff01;本文章于2021年末编写#xff0c;获得广泛的好评#xff01;
故在2022年末对本系列进行填充与更新#xff0c;欢迎大家订阅最新的专栏#xff0c;获取基于Pytorch1.10版本的理论代码(2023版)实现#xff0c;
Pytorch深度学习理论篇(2023版)目录地址…同学你好本文章于2021年末编写获得广泛的好评
故在2022年末对本系列进行填充与更新欢迎大家订阅最新的专栏获取基于Pytorch1.10版本的理论代码(2023版)实现
Pytorch深度学习·理论篇(2023版)目录地址为
CSDN独家 | 全网首发 | Pytorch深度学习·理论篇(2023版)目录本专栏将通过系统的深度学习实例从可解释性的角度对深度学习的原理进行讲解与分析通过将深度学习知识与Pytorch的高效结合帮助各位新入门的读者理解深度学习各个模板之间的关系这些均是在Pytorch上实现的可以有效的结合当前各位研究生的研究方向设计人工智能的各个领域是经过一年时间打磨的精品专栏https://v9999.blog.csdn.net/article/details/127587345欢迎大家订阅(2023版)理论篇 以下为2021版原文~~~~ 1 优化器模块的作用
1.1 反向传播的核心思想 反向传播的意义在于告诉模型我们需要将权重修改到什么数值可以得到最优解在开始探索合适权重的过程中正向传播所生成的结果与实际标签的目标值存在误差反向传播通过这个误差传递给权重要求权重进行适当的调整来达到一个合适的输出最终使得正向传播所预测的结果与标签的目标值的误差达到最小以上即为反向传播的核心思想 1.2 优化器简介 正向结构与损失函数获取完毕之后通过优化器模块中优化函数来实现对学习参数的优化其内部原理主要是梯度下降的方法实现的 1.2.1 优化器与梯度下降
优化器是指通过算法帮助模型在训练过程中更快更好地将参数调整到位梯度下降主要在损失函数求解出损失值时它利用梯度下降的方向为前进方向沿着梯度下降的方向求解最小值帮助模型找到最小的那个损失值从而可以反向推算出学习参数的权重达到优化的目的。
1.3 优化器的类型
1.3.1 批量梯度下降
主要特点遍历全部数据集计算一次损失函数根据函数结果更新梯度。
缺点每次都要遍历全部数据集计算开销大计算慢不支持在线学习。
1.3.2 随机梯度下降
主要特点每检查一个数据就进行损失函数计算求梯度更新函数
缺点计算速度快收敛性不好易在最优点附近摆动两次参数也可能互相抵消函数震荡剧烈。
1.3.3 小批量梯度下降折中
主要特点将数据集分成若干批按照批次来实现更新参数一批中的一组数据共同决定梯度的反向梯度下降方向不易跑偏减少随机性计算量小。
缺点————————
2 优化器
2.1 常见的优化器
2.1.1 Adam
较为常用学习率设为3e-4
2.1.2 Ranger
基于RAdam与Lookhead优化器基础上融合而来兼顾两者的优点综合性能占优使得其在各种模型中都具有较高的精度、收敛速度快、使用方便、无需手动调参。
RAdam带有整流器的Adam能够利用潜在散度动态地打开或者管理自适应学习率。Lookhead通过迭代更新两组权重的方法提前观察另一个优化器生成的序列进而选择探索方向。
2.1.3 AMSGrad
在Adam优化器基础上使用二阶冲量在计算机视觉模型上表现更为出色
2.1.4 Adamax
在带有词向量的自然语言处理模型中表现得更好
2.2 如何选取优化器
2.2.1 手动精确调整模型方面
一般先使用Adam优化器训练模型在模型无法进一步收敛后再使用SGD优化器进行手动调节学习率进一步提升模型性能。
2.2.2 自动精确调整模型方面
一般以Adam优化器为最常用在收敛速度、模型训练精度都具有较好的效果对于学习率设置较为宽松更易于使用。
2.3 优化器的使用
2.3.1 优化器调用方法
优化器在工作时先算出梯度根据损失值对某个参数求偏导再沿着该梯度的方向算出一段距离(由学习率决定)该差值作为变化值更新到原有参数上。
import torch
### Adam()是优化器方法
#model.parameters()待优化的权重参数调用模型的parameters()将返回值传入
#lr学习率学习率越大收敛越快
optimizer torch.optim.Adam(model.parameters(),lr lreaning_rate)
2.3.2 查看优化器的参数结构
Pytorch中的每个优化器类中均有param_groups属性该属性包括每个待优化权重的配置参数是一个列表对象
list(optimizer.param_group[0].keys())
#返回 [params,lr,eps,weight_deacy,amsgrad]
#返回 [优化器要作用的权重参数,学习率,,权重参数的衰减率,是否使用二阶冲量的方式]
### 权重参数的衰减率weight_deacy是指模型在训练过程中使用L2郑泽华的衰减参数L2正则化是一种防止过拟合的方法
3 退化学习率
3.1 退化学习率简介
退化学习率/学习率衰减即在刚训练开始时使用大的学习率加速训练到一定程度后使用小的学习率来提高精度。
3.1.1 退化学习率/学习率衰减 手动代码实现
import sklearn.datasets
import torch
import numpy as np
import matplotlib.pyplot as plt
from LogicNet_fun import LogicNet, plot_losses, predict, plot_decision_boundary# 准备数据
np.random.seed(0) # 设置随机种子
X, Y sklearn.datasets.make_moons(200, noise0.2) # 生成两组半圆形数据
arg np.squeeze(np.argwhere(Y 0), axis1) # 获取第1组数据索引
arg2 np.squeeze(np.argwhere(Y 1), axis1) # 获取第2组数据索引
plt.title(moons data) # 设置可视化标题
plt.scatter(X[arg, 0], X[arg, 1], s100, cb, marker, labeldata1) # 显示第一组数据索引
plt.scatter(X[arg2, 0], X[arg2, 1], s40, cr, markero, labeldata2) # 显示第二组数据索引
plt.legend() # 显示图例
plt.show()# 搭建网络模型
model LogicNet(inputdim2,hiddendim3,outputdim2) #实例化模型 输入数据的维度、隐藏节点的数量、模型最终结果的分类数
optimizer torch.optim.Adam(model.parameters(),lr0.01) # 定义优化器 在反向传播时使用# 训练模型
xt torch.from_numpy(X).type(torch.FloatTensor) #将数据转化为张量形式
yt torch.from_numpy(Y).type(torch.LongTensor)
epochs 1000 #训练次数
losses [] # 损失值列表:用来接受每一步的损失值
lr_list [] # 学习率列表用来接受每一步的学习率
for i in range(epochs):loss model.getloss(xt,yt)losses.append(loss.item()) # 保存中间状态的损失值optimizer.zero_grad() # 清空之前的梯度loss.backward() # 反向传播损失值optimizer.step() # 更新参数if i % 50 0: # 每五十步将学习率 lr X 0.99for p in optimizer.param_groups:p[lr] p[lr] * 0.99lr_list.append(optimizer.state_dict()[param_groups][0][lr])
# 学习率可视化
plt.plot(range(epochs),lr_list,colorr)
plt.show() 3.2 使用lr_scheduler接口实现退化学习率
在Ptorch的optim模块中将退化学习率的多种实现方法封装到lr_scheduler接口中
3.2.1 使用lr_scheduler接口实现退化学习率 代码实现
import sklearn.datasets
import torch
import numpy as np
import matplotlib.pyplot as plt
from LogicNet_fun import LogicNet, plot_losses, predict, plot_decision_boundary# 准备数据
np.random.seed(0) # 设置随机种子
X, Y sklearn.datasets.make_moons(200, noise0.2) # 生成两组半圆形数据
arg np.squeeze(np.argwhere(Y 0), axis1) # 获取第1组数据索引
arg2 np.squeeze(np.argwhere(Y 1), axis1) # 获取第2组数据索引
plt.title(moons data) # 设置可视化标题
plt.scatter(X[arg, 0], X[arg, 1], s100, cb, marker, labeldata1) # 显示第一组数据索引
plt.scatter(X[arg2, 0], X[arg2, 1], s40, cr, markero, labeldata2) # 显示第二组数据索引
plt.legend() # 显示图例
plt.show()# 搭建网络模型
model LogicNet(inputdim2,hiddendim3,outputdim2) #实例化模型 输入数据的维度、隐藏节点的数量、模型最终结果的分类数
optimizer torch.optim.Adam(model.parameters(),lr0.01) # 定义优化器 在反向传播时使用# 训练模型
xt torch.from_numpy(X).type(torch.FloatTensor) #将数据转化为张量形式
yt torch.from_numpy(Y).type(torch.LongTensor)
epochs 1000 #训练次数
losses [] # 损失值列表:用来接受每一步的损失值
lr_list [] # 学习率列表用来接受每一步的学习率
scheduler torch.optim.lr_scheduler.StepLR(optimizer,step_size50,gamma0.99) # 设置退化学习率每50步乘以0.99
for i in range(epochs):loss model.getloss(xt,yt)losses.append(loss.item()) # 保存中间状态的损失值optimizer.zero_grad() # 清空之前的梯度loss.backward() # 反向传播损失值optimizer.step() # 更新参数scheduler.step() # 调用退化学习率对象lr_list.append(optimizer.state_dict()[param_groups][0][lr])
# 学习率可视化
plt.plot(range(epochs),lr_list,colorr)
plt.show() 3.2.2 lr_scheduler接口中的退化学习率种类
等间隔调整学习率StepLR()每训练指定步数学习率调整为 lr lr×gamma (gamma为手动设置的退化率参数)。
#optimizer (Optimizer) – 包装的优化器。
#step_size (int) – 学习率衰减间隔例如若为 30则会在 30、 60、 90…个 epoch 时将学习率调整为 lr * gamma。
#gamma (float) – 学习率衰减的乘积因子。
#last_epoch (int) – 最后一个epoch的指数。这个变量用来指示学习率是否需要调整。当last_epoch 符合设定的间隔时就会对学习率进行调整。当为-1 时学习率设置为初始值。
class torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma0.1, last_epoch-1)
#调整倍数为gamma 倍调整间隔为step_size。当last_epoch -1时将初始lr设置为lr。
多间隔调整学习率MultiStepLR()按照指定的步数来调整学习率。调整方式也是lr lr x gamma。指数衰减调整学习率ExponentialLR()每训练一步学习率呈指数型衰减即学习率调整为lrlr ∗ gamma^epoch (step为训练步数)。
class torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma, last_epoch-1)
#根据epoch数和gamma调整学习率每个epoch都在改变调整公式lr∗gamma^epoch。# 参数
## optimizer (Optimizer) – 包装的优化器。
## gamma (float) – 学习率衰减的乘积因子。
## last_epoch (int) – 最后一个epoch的指数。这个变量用来指示学习率是否需要调整。当last_epoch 符合设定的间隔时就会对学习率进行调整。当为-1 时学习率设置为初始值。
余弦退火函数调整学习率CosineAnnealingLR()余弦退火指的就是按照弦函数的曲线进行衰减每训练一步学习率呈余弦函数型衰减。 torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min0, last_epoch-1)
# 参数
## T_max(int) – 一次学习率周期的迭代次数即 T_max 个 epoch 之后重新设置学习率。
## eta_min(float) – 最小学习率即在一个周期中学习率最小会下降到 eta_min默认值为 0。 根据指标调整学习率ReduceLROnPlateau当某指标loss或accuracy在最近几次训练中均没有变化下降或升高超过给定阈值时调整学习率。
自定义调整学习率LambdaLR将每个参数组的学习速率设置为初始的lr乘以一个给定的函数。
class torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch-1)
#参数
##optimizer (Optimizer) – 包装的优化器。
##lr_lambda (function or list) – 一个函数来计算一个乘法因子给定一个整数参数的epoch或列表等功能为每个组optimizer.param_groups。
##last_epoch (int) – 最后一个epoch的指数。这个变量用来指示学习率是否需要调整。当last_epoch 符合设定的间隔时就会对学习率进行调整。当为-1 时学习率设置为初始值。
3.2.3 多种学习率衰减总结
LambdaLR最为灵活可以根据需求指定任何策略的学习率变化。它在fne-tune(微调模型的一种方法)中特别有用不但可以为不同层设置不同的学习率而且可以为不同层设置不同的学习率调整策略。 3.3 使用lr_scheduler接口实现多种退化学习率 MultiStepLR()在论文中使用较多简单可控。 ReducelROnPlateau()自动化程度高参数多。 3.3.1 使用lr_scheduler接口实现MultiStepLR
import sklearn.datasets
import torch
import numpy as np
import matplotlib.pyplot as plt
from LogicNet_fun import LogicNet, plot_losses, predict, plot_decision_boundary# 准备数据
np.random.seed(0) # 设置随机种子
X, Y sklearn.datasets.make_moons(200, noise0.2) # 生成两组半圆形数据
arg np.squeeze(np.argwhere(Y 0), axis1) # 获取第1组数据索引
arg2 np.squeeze(np.argwhere(Y 1), axis1) # 获取第2组数据索引
plt.title(moons data) # 设置可视化标题
plt.scatter(X[arg, 0], X[arg, 1], s100, cb, marker, labeldata1) # 显示第一组数据索引
plt.scatter(X[arg2, 0], X[arg2, 1], s40, cr, markero, labeldata2) # 显示第二组数据索引
plt.legend() # 显示图例
plt.show()# 搭建网络模型
model LogicNet(inputdim2,hiddendim3,outputdim2) #实例化模型 输入数据的维度、隐藏节点的数量、模型最终结果的分类数
optimizer torch.optim.Adam(model.parameters(),lr0.01) # 定义优化器 在反向传播时使用# 训练模型
xt torch.from_numpy(X).type(torch.FloatTensor) #将数据转化为张量形式
yt torch.from_numpy(Y).type(torch.LongTensor)
epochs 1000 #训练次数
losses [] # 损失值列表:用来接受每一步的损失值
lr_list [] # 学习率列表用来接受每一步的学习率
scheduler torch.optim.lr_scheduler.MultiStepLR(optimizer,milestones[200,700,900],gamma0.99) #在100 700 900 次时调整学习率for i in range(epochs):loss model.getloss(xt,yt)losses.append(loss.item()) # 保存中间状态的损失值optimizer.zero_grad() # 清空之前的梯度loss.backward() # 反向传播损失值optimizer.step() # 更新参数scheduler.step() # 调用退化学习率对象lr_list.append(optimizer.state_dict()[param_groups][0][lr])
# 学习率可视化
plt.plot(range(epochs),lr_list,colorr)
plt.show() 3.3.2 使用lr_scheduler接口实现ReduceLROnPlateau
import sklearn.datasets
import torch
import numpy as np
import matplotlib.pyplot as plt
from LogicNet_fun import LogicNet, plot_losses, predict, plot_decision_boundary# 准备数据
np.random.seed(0) # 设置随机种子
X, Y sklearn.datasets.make_moons(200, noise0.2) # 生成两组半圆形数据
arg np.squeeze(np.argwhere(Y 0), axis1) # 获取第1组数据索引
arg2 np.squeeze(np.argwhere(Y 1), axis1) # 获取第2组数据索引
plt.title(moons data) # 设置可视化标题
plt.scatter(X[arg, 0], X[arg, 1], s100, cb, marker, labeldata1) # 显示第一组数据索引
plt.scatter(X[arg2, 0], X[arg2, 1], s40, cr, markero, labeldata2) # 显示第二组数据索引
plt.legend() # 显示图例
plt.show()# 搭建网络模型
model LogicNet(inputdim2,hiddendim3,outputdim2) #实例化模型 输入数据的维度、隐藏节点的数量、模型最终结果的分类数
optimizer torch.optim.Adam(model.parameters(),lr0.01) # 定义优化器 在反向传播时使用# 训练模型
xt torch.from_numpy(X).type(torch.FloatTensor) #将数据转化为张量形式
yt torch.from_numpy(Y).type(torch.LongTensor)
epochs 1000 #训练次数
losses [] # 损失值列表:用来接受每一步的损失值
lr_list [] # 学习率列表用来接受每一步的学习率
scheduler torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer,modemin, # 要监控模型的最大值or最小值factor 0.5, # 退化学习率参数 gammapatience5, # 不再减少/增加的累计次数verboseTrue, # 触发规则时是否打印信息threshold0.001, # 监控值触发规则的阈值threshold_modeabs, # 计算触发条件的规则cooldown0, # 触发规则后的停止监控步数避免lr下降过快min_lr0, # 允许的最小退化学习率eps1e-08 # 当退化学习率小于该值时停止调整
)for i in range(epochs):loss model.getloss(xt,yt)losses.append(loss.item()) # 保存中间状态的损失值scheduler.step(loss.item()) # 调用退化学习率对象需要传入被监控的值否则代码出错 【ReduceLROnPlateau()特别的地方】optimizer.zero_grad() # 清空之前的梯度loss.backward() # 反向传播损失值optimizer.step() # 更新参数lr_list.append(optimizer.state_dict()[param_groups][0][lr])
# 学习率可视化
plt.plot(range(epochs),lr_list,colorr)
plt.show() 上述代码 参数Threshold_mode有两种取值 rel在参数mode为max时如果监控值超过best(1threshold)则触发规则;在参数mode为min时如果监控值低于best(1 - threshold)则触发规则。【best为训练过程中的历史最好值】 abs在参数mode为max时如果监控值超过best threshold则触发规则;在参数mode为min时如果监控值低于best - threshold则触发规则。【best为训练过程中的历史最好值】