深度学习(十四)——优化器

news2024/10/24 6:30:18

前言

反向传播可以求出神经网路中每个需要调节参数的梯度(grad),优化器可以根据梯度进行调整,达到降低整体误差的作用。下面我们对优化器进行介绍。

1. 如何使用优化器

官方文档:torch.optim — PyTorch 2.0 documentation

(1)构造优化器

举个栗子:

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

  • 首先选择优化器的算法optim.SGD

  • 之后在优化器中放入模型参数model.parameters(),这一步是必备

  • 还可在函数中设置一些参数,如学习速率lr=0.01(这是每个优化器中几乎都会有的参数)

(2)调用优化器中的step方法

step()方法就是利用我们之前获得的梯度,对神经网络中的参数进行更新。

举个栗子:

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

  • 步骤optimizer.zero_grad()是必选的

  • 我们的输入经过了模型,并得到了输出output

  • 之后计算输出和target之间的误差loss

  • 调用误差的反向传播loss.backwrd更新每个参数对应的梯度

  • 调用optimizer.step()对卷积核中的参数进行优化调整

  • 之后继续进入for循环,使用函数optimizer.zero_grad()对每个参数的梯度进行清零,防止上一轮循环中计算出来的梯度影响下一轮循环。

2. 优化器的使用

优化器中算法共有的参数(其他参数因优化器的算法而异):

  • params: 传入优化器模型中的参数

  • lr: learning rate,即学习速率

关于学习速率

  • 一般来说,学习速率设置得太大,模型运行起来会不稳定

  • 学习速率设置得太小,模型训练起来会过

  • 建议在最开始训练模型的时候,选择设置一个较大的学习速率;训练到后面的时候,再选择一个较小的学习速率

代码栗子:

import torch.optim
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader

dataset=torchvision.datasets.CIFAR10("./dataset",train=False,download=True,transform=torchvision.transforms.ToTensor())
dataloder=DataLoader(dataset,batch_size=1)

class Demo(nn.Module):
    def __init__(self):
        super(Demo,self).__init__()

        self.model1=Sequential(
            Conv2d(3,32,5,padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, 5, padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024, 64),
            Linear(64, 10)
        )

    def forward(self,x):
        x=self.model1(x)
        return x

demo=Demo()
loss=nn.CrossEntropyLoss()

#设置优化器
#选择随机梯度下降
optim=torch.optim.SGD(demo.parameters(),lr=0.01)   #一般来说,学习速率设置得太大,模型运行起来会不稳定;设置得太小,模型训练起来会比较慢


#对数据进行20次循环
for epoch in range(20):
    running_loss=0.0  #初始化loss
    #该循环只对数据进行了一次训练
    for data in dataloder:
        imgs,targets=data
        output=demo(imgs)
        result_loss=loss(output,targets)

    #----------------优化器训练过程---------------------
        optim.zero_grad()   #各个参数对应的梯度设置为0
        result_loss.backward()  #反向传播,得到每个节点对应的梯度
        optim.step()   #根据每个参数的梯度,对参数进行调优
        running_loss=running_loss+result_loss  #累加该轮循环的loss,计算该轮循环整体误差的总和

    print(running_loss)  #输出该轮循环整体误差的总和

  • [Run]

    tensor(18713.4336, grad_fn=)
    tensor(16178.3564, grad_fn=)
    tensor(15432.6172, grad_fn=)
    tensor(16043.1025, grad_fn=)
    tensor(18018.3359, grad_fn=)

总结使用优化器训练的训练套路):

  • 设置损失函数loss function

  • 定义优化器optim

  • 从使用循环dataloader中的数据:for data in dataloder

    • 取出图片imgs,标签targets:imgs,targets=data

    • 将图片放入神经网络,并得到一个输出:output=model(imgs)

    • 计算误差:loss_result=loss(output,targets)

    • 使用优化器,初始化参数的梯度为0:optim.zero_grad()

    • 使用反向传播求出梯度:loss_result.backward()

    • 根据梯度,对每一个参数进行更新:optim.step()

  • 进入下一个循环,直到完成训练所需的循环次数

3. 如何调整学习速率

再复制粘贴一次:

  • 一般来说,学习速率设置得太大,模型运行起来会不稳定

  • 学习速率设置得太小,模型训练起来会过

  • 建议在最开始训练模型的时候,选择设置一个较大的学习速率;训练到后面的时候,再选择一个较小的学习速率

pytorch中提供了一些方法,可以动态地调整学习速率

官方文档:StepLR — PyTorch 2.0 documentation

(1)StepLR参数简介

参数介绍:

  • optimizer: 放入模型所使用的优化器名称

  • step_size(int): 训练的时候,每多少步进行一个更新

  • gamma(float): 默认为0.1。在循环中,每次训练的时候,新的学习速率=原来学习速率×gamma

不同的优化器中有很多不同的参数,但是这些参数都是跟几个特定的算法相关的,这些需要使用的时候再去了解。

如果只是单纯地使用优化器,那么只需设置optimizer学习速率,就可以满足绝大部分的训练需求。

(2)StepLR代码栗子

import torch.optim
import torchvision
from torch import nn
from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential
from torch.utils.data import DataLoader

dataset=torchvision.datasets.CIFAR10("./dataset",train=False,download=True,transform=torchvision.transforms.ToTensor())
dataloder=DataLoader(dataset,batch_size=1)

class Demo(nn.Module):
    def __init__(self):
        super(Demo,self).__init__()

        self.model1=Sequential(
            Conv2d(3,32,5,padding=2),
            MaxPool2d(2),
            Conv2d(32, 32, 5, padding=2),
            MaxPool2d(2),
            Conv2d(32, 64, 5, padding=2),
            MaxPool2d(2),
            Flatten(),
            Linear(1024, 64),
            Linear(64, 10)
        )

    def forward(self,x):
        x=self.model1(x)
        return x

demo=Demo()
loss=nn.CrossEntropyLoss()

#设置优化器
#选择随机梯度下降
optim=torch.optim.SGD(demo.parameters(),lr=0.01)   #一般来说,学习速率设置得太大,模型运行起来会不稳定;设置得太小,模型训练起来会比较慢

#加入学习速率更新
scheduler = torch.optim.lr_scheduler.StepLR(optim, step_size=5, gamma=0.1)

#对数据进行20次循环
for epoch in range(20):
    running_loss=0.0  #初始化loss
    #该循环只对数据进行了一次训练
    for data in dataloder:
        imgs,targets=data
        output=demo(imgs)
        result_loss=loss(output,targets)

    #----------------优化器训练过程---------------------
        optim.zero_grad()   #各个参数对应的梯度设置为0;如果不写这行代码,那么每次循环中都会对这个梯度进行累加
        result_loss.backward()  #反向传播,得到每个节点对应的梯度
        #optim.step()   #根据每个参数的梯度,对参数进行调优
        scheduler.step()  #对每个参数的学习速率进行调整;通过scheduler可以在每次循环中对学习速率进行下降
        running_loss=running_loss+result_loss  #累加该轮循环的loss,计算该轮循环整体误差的总和

    print(running_loss)  #输出该轮循环整体误差的总和

最后的最后

感谢你们的阅读和喜欢,我收藏了很多技术干货,可以共享给喜欢我文章的朋友们,如果你肯花时间沉下心去学习,它们一定能帮到你。

因为这个行业不同于其他行业,知识体系实在是过于庞大,知识更新也非常快。作为一个普通人,无法全部学完,所以我们在提升技术的时候,首先需要明确一个目标,然后制定好完整的计划,同时找到好的学习方法,这样才能更快的提升自己。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

五、面试资料

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下。
在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1842969.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

DataOps真能“降本增效”?

在各行各业中,越来越多的公司开始重视收集数据,并寻找创新方法来获得真实可行的商业成果,并且愿意投入大量时间和金钱来实现这一目标。 据IDC称,数据和分析软件及云服务市场规模在 2021 年达到了 900 亿美元,随着企业继…

T230L单路HDMI高清采集卡带1路HDMI环出

同三维T230L单路HDMI高清采集卡 带1路HDMI环出 产品简介: 同三维T230L是在老款T230L基础上升级的产品,由输入环出4K30升级到4K60,此款产品是一款单路(1路)HDMI高清音视频采集卡,还带1路HDMI环出,可采集1路…

自由度与反证法

在 一道全等三角形几何证明题 的最后我使用反证法获得了解法三,但只是稍微提到了自由度,本文详细说一下,然后下一篇文章给出我的一个求最小生成树的新方法,同样基于自由度和反证法。 再次给出那道几何题,并给出一些话…

手机携号转网接口查询与对接指南:技术开发者必备手册

在当今通信技术飞速发展的背景下,手机携号转网已成为推动电信市场竞争、保障用户权益的重要手段。而对于技术开发者而言,掌握手机携号转网接口的查询与对接方法,无疑是提升服务兼容性和用户满意度的关键。 比如如下应用场景: 1.…

如何删除电脑自带的游戏

要删除电脑自带的游戏,如扫雷和纸牌,你可以按照以下步骤操作,这些步骤基于Windows操作系统: 对于Windows 7及其更早版本 打开控制面板选择“程序”打开或关闭Windows功能找到并取消勾选游戏 对于Windows 10及更高版本 打开“设…

基于Springboot+vue 共享车位系统小程序-计算机毕设 附源码94559

Springboot 共享车位系统小程序 摘 要 在信息飞速发展的今天,网络已成为人们重要的信息交流平台。每天都有大量的农产品需要通过网络发布,为此,本人开发了一个基于springboot共享车位系统小程序。 对于本共享车位系统的设计来说,…

Ike-scan一键发现通过互联网的IPsec VPN服务器(KALI工具系列二十八)

目录 1、KALI LINUX 简介 2、Ike-scan工具简介 3、信息收集 3.1 目标主机IP(服务器) 3.2 KALI的IP 4、操作示例 4.1 简单扫描 4.2 范围扫描 4.3 扫描多个目标 4.4 输出扫描结果 4.5 特殊扫描 5、总结 1、KALI LINUX 简介 Kali Linux 是一个功…

【R语言】对一个Plot绘制多个图,并且每个图单元也包含多个图

以一个Plot绘制五行六列共30个图&#xff0c;然后每30个图单元包含两个图为例&#xff1a; 如下图所示&#xff1a; 代码如下&#xff1a; for (i in 1:(5*6)) {create_subplots <- function() {library(ggplot2)library(dplyr)library(tidyr)# 创建一个随机的数据框simula…

传统后端SQL数据层替代解决方案: 内置数据源+JdbcTemplate+H2数据库 详解

内置数据源 我们回顾一下druid数据源的配置方式 通过type属性指定数据源的类型 导入依赖 starter就使用了spring的自动装配功能 格式二是在引入druid的依赖的基础上 进行的一种配置方式 Tomcat内部也可以进行数据源的配置 轻量级中最快的数据源对象 我们切换德鲁伊连接池 我…

springboot vue 开源 会员收银系统 (7) 收银台的完善 新增开卡 结算

前言 完整版演示 开发版演示 在前面的开发中&#xff0c;我们成功完成了商品分类和商品信息的搭建&#xff0c;开发了收银台基础。现在&#xff0c;我们将进一步完善收银台的功能&#xff0c;添加开卡和结算功能&#xff0c;并在后台实现会员卡的创建和订单保存。同时&#xff…

船舶行业信息安全解决方案介绍

船舶行业信息安全背景&#xff1a; 近年来随着经济复苏、疫情与国际形势影响国内外船舶海运业务蓬勃发展&#xff0c;在业务量激增的背景下出现多类信息安全事件。其中2017年&#xff0c;马士基集团遭到勒索软件攻击&#xff0c;内部业务系统和码头操作系统均受到严重影响&…

U盘数据恢复,小白也适用的4个方法!

你是否曾经遇到过这样的情况&#xff1a;当你满怀期待地插入U盘&#xff0c;准备欣赏那些珍贵的照片、视频或重要文件时&#xff0c;却发现U盘中的数据仿佛被一阵海风轻轻吹散&#xff0c;只剩下空荡荡的文件夹和一片茫然。那种失落感&#xff0c;就像是突然发现手中的藏宝图被…

(四十三)Vue Router之嵌套路由

文章目录 什么是嵌套路由嵌套路由的使用demo 上一篇&#xff1a;&#xff08;四十二&#xff09;Vue之路由及其基本使用Vue Router 什么是嵌套路由 实际生活中的应用界面&#xff0c;有可能由多层嵌套的组件组合而成。同样地&#xff0c;URL 中各段动态路径也按某种结构对应嵌…

数据可视化案例

数据可视化案例 相关的技术&#xff1a;scrapy、pandas、pyecharts。 使用豆瓣电影中的数据来进行可视化&#xff0c;网址&#xff1a;豆瓣电影 Top 250 (douban.com) 一、网页数据分析 我们需要爬取的是豆瓣电影Top250网页每一页的电影名称、图片链接、导演、年份、国家、电…

Bert模型实现中文新闻文本分类

Bert基于Transformer架构是解决自然语言处理的深度学习模型&#xff0c;常使用在文本分类、情感分析、词性标注等场合。 本文将使用Bert模型对中文文本进行分类&#xff0c;其中训练集数据18W条&#xff0c;验证集数据1W条,包含10个类别的文本数据&#xff0c;数据可以自己从Ka…

大润发超市购物卡怎么用?

收到大润发超市的礼品卡以后&#xff0c;我才发现&#xff0c;最近的大润发也得十来公里 为了100块的大润发打车也太不划算了 叫外送也不在配送范围内 最后没办法&#xff0c;在收卡云上出掉了&#xff0c;还好最近价格不错&#xff0c;也不亏&#xff0c;收卡云的到账速度也…

leetcode:557. 反转字符串中的单词 III(python3解法)

难度&#xff1a;简单 给定一个字符串 s &#xff0c;你需要反转字符串中每个单词的字符顺序&#xff0c;同时仍保留空格和单词的初始顺序。 示例 1&#xff1a; 输入&#xff1a;s "Lets take LeetCode contest" 输出&#xff1a;"steL ekat edoCteeL tsetnoc…

使用飞书多维表格实现推送邮件

一、为什么用飞书&#xff1f; 在当今竞争激烈的商业环境中&#xff0c;选择一款高效、智能的办公工具至关重要。了解飞书的朋友应该都知道&#xff0c;飞书的集成能力是很强大的&#xff0c;能够与各种主流的办公软件无缝衔接&#xff0c;实现数据交互&#xff0c;提升工作效…

恒创科技:云主机上的数据安全如何保证?(实用性技巧分享)

云主机上的数据安全如何保证?答案很简单&#xff0c;虽很多用户却不能完全做到&#xff0c;但我们可以了解一些安全措施予以防范。以下是云主机数据保护的几个实用技巧&#xff0c;希望对您有所帮助! 1.避免将敏感信息存储在云中 网络上的许多建议听起来都像这样&#xff1a;“…

业余时间做跨境电商实现经济自由,我是怎么做的?

在知乎问答上翻阅大家非常感兴趣的问题&#xff0c;解答一些疑惑的同时&#xff0c;发现大家对跨境电商还是很感兴趣的&#xff0c;类似“小白如何入局跨境电商&#xff1f;2024跨境电商平台&#xff0c;哪些值得做&#xff1f;现在电商哪个平台好做?”等的这些主观问题&#…