4.3pytorch便利的优化器(代码片段)

王小小小草 王小小小草     2022-12-07     800

关键词:

欢迎订阅本专栏:《PyTorch深度学习实践》
订阅地址:https://blog.csdn.net/sinat_33761963/category_9720080.html

  • 第二章:认识Tensor的类型、创建、存储、api等,打好Tensor的基础,是进行PyTorch深度学习实践的重中之重的基础。
  • 第三章:学习PyTorch如何读入各种外部数据
  • 第四章:利用PyTorch从头到尾创建、训练、评估一个模型,理解与熟悉PyTorch实现模型的每个步骤,用到的模块与方法。
  • 第五章:学习如何利用PyTorch提供的3种方法去创建各种模型结构。
  • 第六章:利用PyTorch实现简单与经典的模型全过程:简单二分类、手写字体识别、词向量的实现、自编码器实现。
  • 第七章利用PyTorch实现复杂模型:翻译机(nlp领域)、生成对抗网络(GAN)、强化学习(RL)、风格迁移(cv领域)。
  • 第八章:PyTorch的其他高级用法:模型在不同框架之间的迁移、可视化、多个GPU并行计算。

4.2节介绍了自动求导机制,求出梯度(params.grad)后,我们进行了手动更新:params = (params - learning_rate * params.grad).detach().requires_grad_(), 这里使用的是最常用的SGD梯度优化方法。

Pytorch封装了多种多样的优化器供大家使用,无需手动写出优化的公式,只需要调用接口定义即可。来看一看吧~

4.3.1 初识

首先来看看pytorch提供了哪些优化器:

import torch.optim as optim

print(dir(optim))
['ASGD', 'Adadelta', 'Adagrad', 'Adam', 'Adamax', 'LBFGS', 'Optimizer', 'RMSprop', 'Rprop', 'SGD', 'SparseAdam', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__', '__spec__', 'lr_scheduler']

每个优化器都提供两个方法:

  • zero_grad: 将传给优化器的所有变量的梯度都置零
  • step: 更具优化器的优化策略来更新传入的变量的值

仍然沿用之前的例子:

import torch

# 构建模型函数
def model(x, w, b):
    return w*x + b

# 构建损失函数
def loss_fn(y_p, y):
    squared_diffs = (y_p - y) ** 2
    return squared_diffs.mean()

# x与y
x = [0.5, 14.0, 15.0, 28.0, 11.0, 8.0, 3.0, -4.0, 6.0, 13.0, 21.0]
y = [35.7, 55.9, 58.2, 81.9, 56.3, 48.9, 33.9, 21.8, 48.4, 60.4, 68.4]
x = torch.tensor(x)
y = torch.tensor(y)
x = 0.1 * x

# 初始化参数
params = torch.tensor([1.0, 0.0], requires_grad=True)

# 构建优化器
learning_rate = 1e-5
optimizer = optim.SGD([params], lr=learning_rate)  # 注意这里(新增步骤)

# 前向计算
y_p = model(x, *params)
loss = loss_fn(y_p, y)

# 后向计算
optimizer.zero_grad()  # 将优化器中的所有变量的梯度都置零
loss.backward()  # 反向计算
optimizer.step()  # 更新参数

print(params)


tensor([1.0013, 0.0010], requires_grad=True)

以上过程中,我们没有手动更新params,而是通过optimizer.step()进行自动更新,打印出来的pramas也确实被更新了。

4.3.2 完整迭代过程

上面是进行了一次迭代,下面来看看完整的迭代过程:

def training_loop(n_epochs, optimizer, params, x, y):
    for epoch in range(1, n_epochs+1):
        y_p = model(x, *params)
        loss = loss_fn(y_p, y)
        
        optimizer.zero_grad()
        loss.backward()
        optimizer.step()
        
        if epoch % 100 == 0:
            print('Epoch %d, Loss %f' % (epoch, float(loss)))
        
    return params

params = torch.tensor([1.0, 0.0], requires_grad=True)
learning_rate = 1e-2
optimizer = optim.SGD([params], lr=learning_rate)

training_loop(
    n_epochs = 1000,
    optimizer = optimizer,
    params = params,
    x = x,
    y = y
)
Epoch 100, Loss 39.538250
Epoch 200, Loss 18.696901
Epoch 300, Loss 12.456582
Epoch 400, Loss 10.581183
Epoch 500, Loss 10.017575
Epoch 600, Loss 9.848182
Epoch 700, Loss 9.797276
Epoch 800, Loss 9.781981
Epoch 900, Loss 9.777378
Epoch 1000, Loss 9.776002





tensor([17.9473, 32.9443], requires_grad=True)

总结:

  • torch.optim 提供多类优化器
  • 优化器有2个方法:zero_grad, step

pytorch学习-5:批训练+optimizer优化器(代码片段)

pytorch学习-5:批训练+Optimizer优化器1.批训练1.1DataLoaderDataLoader是torch给你用来包装你的数据的工具.所以你要讲自己的(numpyarray或其他)数据形式装换成Tensor,然后再放进这个包装器中.使用DataLoader有什么好处呢?就是他们帮你有... 查看详情

pytorch中adam优化器的参数问题(代码片段)

之前用的adam优化器一直是这样的:alpha_optim=torch.optim.Adam(model.alphas(),config.alpha_lr,betas=(0.5,0.999),weight_decay=config.alpha_weight_decay)没有细想内部参数的问题,但是最近的工作中是要让优化器中的部分参数参与梯度更新,其余部分不更... 查看详情

pytorch优化器全总结常用优化器性能对比含代码(代码片段)

....Adam6.Adamax7.AdaW8.L-BFGS二、优化器对比优化器系列文章列表Pytorch优化器全总结(一)SGD、ASGD、Rprop、AdagradPytorch优化器全总结(二)Adadelta、RMSprop、Adam、Adamax、AdamW、NAdam、SparseAdamPytorch优化器全总结(三)... 查看详情

pytorch自定义优化器optimizer简单总结(附adamw代码分析)(代码片段)

写在前面虽然pytorch,tensorflow等主流框架已经为我们内置了很多已经被广泛使用的优化算法,比如SGD,Adam,Adagrad等等,但是有的时候往往需要对优化器做一定的改动,才能使我们的模型收敛到最优解;或者说我们就是对SGD系列算... 查看详情

pytorch自定义优化器optimizer简单总结(附adamw代码分析)(代码片段)

写在前面虽然pytorch,tensorflow等主流框架已经为我们内置了很多已经被广泛使用的优化算法,比如SGD,Adam,Adagrad等等,但是有的时候往往需要对优化器做一定的改动,才能使我们的模型收敛到最优解;或者说我们就是对SGD系列算... 查看详情

pytorch框架的深度学习优化算法集(代码片段)

文章目录前言1 优化的目标2 深度学习中的优化挑战    2.1 鞍积分    2.2 消失渐变3 凸性    3.1 convex set    3.2 凸函数4 局部极小值是全局极小值5 约束6 总结参考前言一、什么是优化器优化器或者优化算法,是... 查看详情

pytorch优化器全总结牛顿法bfgsl-bfgs含代码(代码片段)

...torch.optim.LBFGS说明2.使用LBFGS优化模型优化器系列文章列表Pytorch优化器全总结(一)SGD、ASGD、Rprop、AdagradPytorch优化器全总结(二) 查看详情

pytorch优化器全总结sgdasgdrpropadagrad(代码片段)

目录写在前面一、 torch.optim.SGD随机梯度下降SGD代码SGD算法解析1.MBGD(Mini-batchGradientDescent)小批量梯度下降法 2.Momentum动量3.NAG(Nesterovaccelerated gradient)SGD总结二、torch.optim.ASGD随机平均梯度下降三、torch.optim.Rprop四、tor 查看详情

pytorch常用优化器总结(包括warmup介绍及代码实现)(代码片段)

...小批量梯度下降法(MBGD)动量优化SGD+MomentumNAGpytorch中SGD:自适应学习率AdaGradAdadeltaRMSPropAdamwarmup优化算法大致分为:梯度下降法,动量优化法,自适应学习率三种。梯度下降法梯度下降GD通过lo 查看详情

pytorch常用优化器总结(包括warmup介绍及代码实现)(代码片段)

...小批量梯度下降法(MBGD)动量优化SGD+MomentumNAGpytorch中SGD:自适应学习率AdaGradAdadeltaRMSPropAdamwarmup优化算法大致分为:梯度下降法,动量优化法,自适应学习率三种。梯度下降法梯度下降GD通过lo 查看详情

pytorch优化器全总结adadeltarmspropadamadamaxadamwnadamsparseadam(重置版)(代码片段)

目录写在前面一、torch.optim.AdadeltaAdadelta代码Adadelta算法解析Adadelta总结二、torch.optim.RMSpropRMSprop代码RMSprop算法解析RMSprop总结三、torch.optim.Adam(AMSGrad)Adam代码Adam算法解析Adam总结四、torch.optim.AdamaxAdamax代码Adamax算法解析Adama 查看详情

pytorch入门pytorch神经网络工具(代码片段)

Pytorch神经网络工具前向传播反向传播神经网络工具箱nnnn.Modulenn.funtional优化器动态修改学习率核心组件层:神经网络的基本结构,将输入张量幻化为输出张量模型:层组成的网络损失函数:参与学习的目标函数... 查看详情

pytorch学习-5:批训练+optimizer优化器(代码片段)

pytorch学习-5:批训练+Optimizer优化器1.批训练1.1DataLoaderDataLoader是torch给你用来包装你的数据的工具.所以你要讲自己的(numpyarray或其他)数据形式装换成Tensor,然后再放进这个包装器中.使用DataLoader有什么好处呢?就是他们帮你有... 查看详情

pytorch模型查看网络参数的梯度以及参数更新是否正确,优化器学习率的分层设置(代码片段)

主要目标有的时候想看一下设置了优化器和学习率之后是否按照我设置的样子去进行更新,所以想查看一下网络参数中的及各相关变量:更新前的值优化器中的学习率计算出loss之后的梯度值更新后的值有了这几个值,... 查看详情

pytorch优化器传入两个模型的参数/保存和加载两个模型的参数(代码片段)

在人脸识别任务中,当我定义模型backbone后,用到Arcface_loss,但这个Arcface_loss也是用nn.Module模块写的,所以实例化出来也是一个网络,而且原论文中,Arcface_loss还是以backbone权重参数10倍的权重衰减方式更新... 查看详情

pytorch优化器传入两个模型的参数/保存和加载两个模型的参数(代码片段)

在人脸识别任务中,当我定义模型backbone后,用到Arcface_loss,但这个Arcface_loss也是用nn.Module模块写的,所以实例化出来也是一个网络,而且原论文中,Arcface_loss还是以backbone权重参数10倍的权重衰减方式更新... 查看详情

pytorch实例2——文本情绪分类器(代码片段)

实例主要用于熟悉相关模型,并且练习创建一个模型的步骤:数据收集、数据预处理、构建模型、训练模型、测试模型、观察模型表现、保存模型传送门:蓝桥云课实验目录1.实验环境2.实验目的3.相关原理4.实验步骤4... 查看详情

pytorch.optimizer优化算法(代码片段)

https://zhuanlan.zhihu.com/p/346205754https://blog.csdn.net/google19890102/article/details/69942970https://zhuanlan.zhihu.com/p/32626442https://zhuanlan.zhihu.com/p/32230623文章目录1.优化器optimizer1.1step才是更新参数1.0常见优化器变量定义1.1SGD1.2Momentum动量1.3SGD-M1.4Nester... 查看详情