前文传送门:

从零开始深度学习Pytorch笔记(1)——安装Pytorch

从零开始深度学习Pytorch笔记(2)——张量的创建(上)

从零开始深度学习Pytorch笔记(3)——张量的创建(下)

从零开始深度学习Pytorch笔记(4)——张量的拼接与切分

从零开始深度学习Pytorch笔记(5)——张量的索引与变换

从零开始深度学习Pytorch笔记(6)——张量的数学运算

从零开始深度学习Pytorch笔记(7)—— 使用Pytorch实现线性回归

从零开始深度学习Pytorch笔记(8)—— 计算图与自动求导(上)

从零开始深度学习Pytorch笔记(9)—— 计算图与自动求导(下)

从零开始深度学习Pytorch笔记(10)—— Dataset类

从零开始深度学习Pytorch笔记(11)—— DataLoader类

从零开始深度学习Pytorch笔记(12)—— nn.Module在该系列的上一篇,我们讲解了nn.Module类,本篇我们来聊聊torch.optim。在机器学习和深度学习中,我们在训练阶段通常要不断修改调整参数,使得损失函数最小化,优化算法是一种调整模型参数更新的策略。torch.optim是一个实现各种优化算法的包,大多数常见的的算法都能够直接通过这个包来调用,例如随机梯度下降,加入了动量的随机梯度下降等等。为了使用torch.optim,你需要构建一个optimizer对象。然后,你可以设置optimizer的参数选项,比如学习率,权重衰减,等等。这个对象能够保持当前参数状态并基于计算得到的梯度进行参数更新。

optimizer = optim.SGD(model.parameters(), lr = 0.01, momentum=0.9)optimizer = optim.Adam([var1, var2], lr = 0.0001)

所有的optimizer都实现了step()方法,这个方法会更新所有的参数。它能按两种方式来使用:(1)optimizer.step()这是大多数optimizer所支持的简化版本。一旦梯度被如backward()之类的函数计算好后,我们就可以调用这个函数。

#例如:for input, target in dataset:   optimizer.zero_grad()   output = model(input)   loss = loss_fn(output, target)   loss.backward()   optimizer.step()

以上代码的含义是,在每次循环数据集迭代时,首先将优化器初始化清空梯度,然后执行前向传播,计算损失值,误差反向传播,最后更新参数。(2)optimizer.step(closure)一些优化算法例如Conjugate Gradient和LBFGS需要重复多次计算函数,因此你需要传入一个闭包去允许它们重新计算你的模型。这个闭包应当清空梯度, 计算损失,然后返回。

#例如:for input, target in dataset:    def closure():        optimizer.zero_grad()        output = model(input)        loss = loss_fn(output, target)        loss.backward()        return loss    optimizer.step(closure)

我们介绍几种优化算法和使用的方法:随机梯度下降:Stochastic Gradient Descent (SGD)SGD算法是从样本中随机抽出一组,训练后按梯度更新一次,然后再抽取一组,再更新一次,在样本量及其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型了。

opt_SGD = torch.optim.SGD(params, lr=, momentum=0, dampening=0, weight_decay=0, nesterov=False)

参数:params (iterable) – 待优化参数的iterable或者是定义了参数组的dictlr (float) – 学习率momentum (float, 可选) – 动量因子(默认:0)weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认:0)dampening (float, 可选) – 动量的抑制因子(默认:0)nesterov (bool, 可选) – 使用Nesterov动量(默认:False)动量梯度下降:Momentum此时的梯度不再只是当前数据的梯度,而是有一定权重的之前的梯度。要是当前时刻的梯度与历史时刻梯度方向相似,这种趋势在当前时刻则会加强;要是不同,则当前时刻的梯度方向减弱。

opt_Momentum = torch.optim.SGD(params, lr=, momentum=0.9, dampening=0, weight_decay=0, nesterov=False)

参数:params (iterable) – 待优化参数的iterable或者是定义了参数组的dictlr (float) – 学习率momentum (float, 可选) – 动量因子(默认:0)weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认:0)dampening (float, 可选) – 动量的抑制因子(默认:0)nesterov (bool, 可选) – 使用Nesterov动量(默认:False)Adagrad优化学习率Adagrad使学习率适应不同的梯度:梯度越大越陡峭学习率越小,希望步子迈小一点(不希望越过最低点所以步子要小一点),梯度越小越平坦学习率越大希望步子迈大一点。随着时间的推移步长会衰减到0。

opt_Adagrad = torch.optim.Adagrad(params, lr=0.01, lr_decay=0, weight_decay=0)

参数:params (iterable) – 待优化参数的iterable或者是定义了参数组的dictlr (float, 可选) – 学习率(默认: 1e-2)lr_decay (float, 可选) – 学习率衰减(默认: 0)weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)RMSProp(root mean square prop)因为Adagrad算法会出现提前停止的现象,所以在RMSProp算法中解决了这个问题,它采用指数加权平均的思想,只将最近的梯度进行累加计算平方。

opt_RMSprop = torch.optim.RMSprop(params, lr=0.01, alpha=0.99, eps=1e-08, weight_decay=0, momentum=0, centered=False)

参数:params (iterable) – 待优化参数的iterable或者是定义了参数组的dictlr (float, 可选) – 学习率(默认:1e-2)momentum (float, 可选) – 动量因子(默认:0)alpha (float, 可选) – 平滑常数(默认:0.99)eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)centered (bool, 可选) – 如果为True,计算中心化的RMSProp,并且用它的方差预测值对梯度进行归一化weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)Adam

opt_Adam = torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0)

参数:params (iterable) – 待优化参数的iterable或者是定义了参数组的dictlr (float, 可选) – 学习率(默认:1e-3)betas (Tuple[float, float], 可选) – 用于计算梯度以及梯度平方的运行平均值的系数(默认:0.9,0.999)eps (float, 可选) – 为了增加数值计算的稳定性而加到分母里的项(默认:1e-8)weight_decay (float, 可选) – 权重衰减(L2惩罚)(默认: 0)

例子:optimizer = torch.optim.SGD(model.parameters(), lr=0.1, momentum=0.9)optimizer.zero_grad()loss_fn(model(input), target).backward()optimizer.step()

SGD 是最普通的优化器, 也可以说没有加速效果, 而 Momentum 是 SGD 的改良版, 它加入了动量原则. 后面的 RMSprop 又是 Momentum 的升级版. 而 Adam 又是 RMSprop 的升级版。并不是越先进的优化器, 结果越佳. 我们在自己的试验中可以尝试不同的优化器, 找到那个最适合你数据/网络的优化器。本文主要给出了在Pytorch中如何使用这些优化算法,并给出了可调的参数,之后有机会可以仔细讲讲这几个优化算法的数学原理。欢迎关注公众号学习之后的深度学习连载部分~历史文章推荐阅读:从零开始学自然语言处理(六)—— 命名实体识别从零开始学自然语言处理(五)—— 词性标注从零开始学自然语言处理(四)—— 做 NLP 任务文本 id 化与预训练词向量初始化方法从零开始学自然语言处理(三)——手把手带你实现word2vec(skip-gram)从零开始学自然语言处理(二)——手把手带你用代码实现word2vec从零开始学自然语言处理(一)—— jieba 分词你不知道的Python环境管理技巧,超级好用!Python快速安装库的靠谱办法你只会用Python的pip安装包?别错过这些好用功能!

扫码下图关注我们不会让你失望!喜欢记得点再看哦,证明你来看过~

torch的拼接函数_从零开始深度学习Pytorch笔记(13)—— torch.optim相关推荐

  1. 【 线性回归 Linear-Regression torch模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人(4/10)】

    torch模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 深度学习 Pytorch笔记 B站刘二大人(4/10) 介绍 至此开始,深度学习模型构建的预备知识已经完全准备完毕. 从本章开 ...

  2. 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】

    卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10) 在上一章已经完成了卷积神经网络的结构分析,并通过各个模块理解 ...

  3. 深度学习PyTorch笔记(12):线性神经网络——softmax回归

    深度学习PyTorch笔记(12):线性神经网络--softmax回归 6 线性神经网络--softmax回归 6.1 softmax回归 6.1.1 概念 6.1.2 softmax运算 6.2 图 ...

  4. 【分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人(8/10)】

    分类器 Softmax-Classifier softmax数学原理与源码详解 深度学习 Pytorch笔记 B站刘二大人 (8/10) 在进行本章的数学推导前,有必要先粗浅的介绍一下,笔者在广泛查找 ...

  5. 【 反向传播算法 Back-Propagation 数学推导以及源码详解 深度学习 Pytorch笔记 B站刘二大人(3/10)】

    反向传播算法 Back-Propagation 数学推导以及源码详解 深度学习 Pytorch笔记 B站刘二大人(3/10) 数学推导 BP算法 BP神经网络可以说机器学习的最基础网络.对于普通的简单 ...

  6. 深度学习PyTorch笔记(9):自动求导

    深度学习PyTorch笔记(9):自动求导 4. 自动求导 4.1 理解 4.2 梯度 4.3 .requires_grad与.grad_fn 4.4 调用.backward()反向传播来完成所有梯度 ...

  7. 【 数据集加载 DatasetDataLoader 模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 (7/10)】

    数据集加载 Dataset&DataLoader 模块实现与源码详解 深度学习 Pytorch笔记 B站刘二大人 (7/10) 模块介绍 在本节中没有关于数学原理的相关介绍,使用的数据集和类型 ...

  8. 【 非线性回归 Logistics-Regression 模块实现与源码解读 深度学习 Pytorch笔记 B站刘二大人(5/10)】

    非线性回归 Logistics-Regression 模块实现与源码解读 深度学习 Pytorch笔记 B站刘二大人(5/10) 数学推导 什么是logistics函数 在定义上Logistic函数或 ...

  9. 【多输入模型 Multiple-Dimension 数学原理分析以及源码详解 深度学习 Pytorch笔记 B站刘二大人 (6/10)】

    多输入模型 Multiple-Dimension 数学原理分析以及源码源码详解 深度学习 Pytorch笔记 B站刘二大人(6/10) 数学推导 在之前实现的模型普遍都是单输入单输出模型,显然,在现实 ...

最新文章

  1. pycharm 打开cfg高亮
  2. RS232详解(续)
  3. Visual Studio 2013开发 mini-filter driver step by step (1) - 创建 mini filter driver 工程
  4. tensorflow tf.encode_base64()(将字符串编码为网络安全的base64格式)
  5. Java实现基数排序及其推导过程 Radix Sort
  6. 使用jspsmartupload完成简单的文件上传系统
  7. 双绞线传输距离_光纤传输有哪些特点 光纤传输原理介绍【图文】
  8. android 非法字符 \ufeff错误
  9. [转:有种感觉叫佩服]一个程序员的奋斗历程
  10. [Leedcode][JAVA][第146题][LRU][哈希表][双向链表]
  11. 香蜜台词共赴鸿蒙,香蜜台词斗法
  12. SQLAlchemy基本使用(Flask中)
  13. SpringMVC自学日志02(初识SpringMVC)
  14. eclipse调试的时候查看变量出现com.sun.jdi.InvocationException occurred invoking method.
  15. 图灵奖得主Bengio和LeCun称自监督学习可使AI达到人类智力水平
  16. c语言逻辑运算符用法大全,C语言逻辑运算符介绍和示例
  17. 批量OCR识别图片中的文字
  18. 【自然语言处理】【多模态】Product1M:基于跨模态预训练的弱监督实例级产品检索
  19. 纪录片《燃点》快上映
  20. ssm启动不报错_ssm整合 启动表现层报错。。。

热门文章

  1. Cpp / Hash 所得字符串转成 Hex 字符串。
  2. ajax刷新数据库数据,ajax删除数据刷新数据库
  3. 电脑桌面没有计算机图标鼠标也点不起来,为什么我的电脑桌面上的图标有时用鼠标怎么点也没反应呀?...
  4. vs python opencv配置_python如何配置opencv
  5. python实现排序算法_python实现·十大排序算法之插入排序(Insertion Sort)
  6. c语言编程输出所有水仙花数,c语言中,如何输出所有的水仙花数
  7. go mod依赖离线安装_go mod 无法自动下载依赖包的问题
  8. python显示语言错误_Python错误和异常
  9. c#如何跳出一个函数_C#初学者教程系列9:类和对象
  10. python 依据某几列累加求和_如何用Python找出OBV金叉的股票?