神经网络——torch.optim优化器的使用

这篇具有很好参考价值的文章主要介绍了神经网络——torch.optim优化器的使用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。



optimizer.step()是大多数优化器支持的简化版本。 一旦使用例如计算梯度,就可以调用该函数。 backward()反向传播。

文章目录

一、 官方文档

1. 什么是torch.optim?

2. How to use an optimizer(如何使用优化器)

2.1 Constructing it(构建它)

2.2 Per-parameter options(每个参数选项)    

2.3 Taking an optimization step(采取优化步骤)

二、torch.optim的算法

2.1 torch.optim.Optimizer(params, defaults)

2.2 Adadelta

2.3 使用torch.optim.SGD进行学习

一、 官方文档
1. 什么是torch.optim?
torch.optim 是一个实现各种优化算法的包。 最常用的方法都已经支持了,接口也足够通用,以后也可以轻松集成更复杂的方法。

2. How to use an optimizer(如何使用优化器)
要使用 torch.optim,必须构造一个优化器对象,该对象将保持当前状态并根据计算的梯度更新参数。

2.1 Constructing it(构建它)
要构造一个优化器,你必须给它一个包含要优化的参数(都应该是变量)的迭代。 然后,您可以指定优化器特定的选项,例如学习率、权重衰减等。

Note:
如果您需要通过 .cuda() 将模型移动到 GPU,请在为其构建优化器之前执行此操作。 .cuda() 之后的模型参数将与调用之前的对象不同。
通常,在构建和使用优化器时,应该确保优化的参数位于一致的位置。

2.2 Per-parameter options(每个参数选项)    
不会,后面补充。

2.3 Taking an optimization step(采取优化步骤)
所有优化器都实现了一个更新参数的 step() 方法。 它可以通过两种方式使用:

第一种是optimizer.step()
这是大多数优化器支持的简化版本。 一旦使用例如计算梯度,就可以调用该函数。 backward()反向传播。

for input, target in dataset:
    optimizer.zero_grad()        #这是将上一步求得每个参数对应的梯度进行清0,以防上一步的梯度造成影响
    output = model(input)      #数据经过神经网络得到一个输出
    loss = loss_fn(output, target)    #计算出losss,得到输出与目标之间的误差
    loss.backward()                  #反向传播,得到每一个要更新的参数的梯度
    optimizer.step()                 #调用optimizer.step,每一个参数都会根据反向传播得到的梯度进行优化


第二种是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)

二、torch.optim的算法
2.1 torch.optim.Optimizer(params, defaults)
这是优化器的基本结构,每个优化器类都有着两个参数。
 

参数:
params (iterable) – an iterable of torch.Tensor s or dict s. Specifies what Tensors should be optimized.
( 可迭代的 torch.Tensor 或 dict 。 指定应该优化哪些张量。)
defaults – (dict): a dict containing default values of optimization options (used when a parameter group doesn’t specify them).
(包含优化选项默认值的字典(在参数组未指定它们时使用)。)

2.2 Adadelta
torch.optim.Adadelta(params, lr=1.0, rho=0.9, eps=1e-06, weight_decay=0)

params:参数,需要将模型的参数输入
lr:学习速率,即learning rate

不同的优化器,只有params和lr前面两个参数是一样的,其他的参数是不一样的。

2.3 使用torch.optim.SGD进行学习
代码如下:

import torch
import torchvision
from torch import nn
from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear
from torch.utils.data import DataLoader
 
#调用CIFAR10数据集
dataset = torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor(),
                                       download=True)
#使用dataloader数据迭代器
dataloader = DataLoader(dataset, batch_size=1)
 
#搭建神经网络,这个Test网络就是CIFAR10数据集的网络
class Test(nn.Module):
    def __init__(self):    #初始化
        super(Test, self).__init__()
        self.seq = Sequential(
            Conv2d(in_channels=3, out_channels=32, kernel_size=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.seq(x)
        return x
 
#创建网络
test = Test()
 
#使用nn.CrossEntropyLoss
loss_cross = nn.CrossEntropyLoss()
optim = torch.optim.SGD(test.parameters(), lr=0.01)
for data in dataloader:
    imgs, targets = data
    optim.zero_grad()    #上一步求得的参数归零
    output = test(imgs)
    result_loss = loss_cross(output, targets)
    result_loss.backward()
    optim.step()
    print(result_loss)
结点运行一下,一开始grad梯度是没有值的none


运行一次backward,grad梯度值就计算出来了


运行optim.step().会发现grad梯度改变了


运行optim.zero_grad(),grad梯度又清零了


如此往复。让我们的Loss变小。

输入print(result_loss),来查看一下代码运行的结果


在每一个节点上,loss值好像并没有减小,那是因为dataloder的数据在这个神经网络中都只看了一遍,
一般情况下,我们需要对数据进行很多轮的学习,这里才学习了一次
故,可以使用for循环,来进行多轮学习

代码如下:

loss_cross = nn.CrossEntropyLoss()
optim = torch.optim.SGD(test.parameters(), lr=0.01)
for epoch in range(20):                  #epoch就是一轮一轮的意思
    running_loss = 0.0       #为了方便观察,用这个查看每一轮中loss值为多少
    for data in dataloader:
        imgs, targets = data
        optim.zero_grad()     #上一步求得的参数归零
        output = test(imgs)
        result_loss = loss_cross(output, targets)
        result_loss.backward()
        optim.step()
        running_loss = running_loss + result_loss
    print(running_loss)
输出结果:

可以看见,Loss值在变小。
 文章来源地址https://www.toymoban.com/news/detail-774050.html

到了这里,关于神经网络——torch.optim优化器的使用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 一维卷积神经网络理解(torch.nn.Conv1d)

    in_channels : (int)输入数据的通道数,即对某条训练数据来说由多少组向量表示。例如对于由一维向量表示的一条数据来说,通道数为1;对于文本数据来说,一个句子是由m个单词组成,那么通道数就可以是m out_channels : (int)卷积产生的通道数,可以理解为卷积核的个数 kernel_siz

    2023年04月08日
    浏览(42)
  • 【Python】【Torch】神经网络中各层输出的特征图可视化详解和示例

    本文对神经网络各层特征图可视化的过程进行运行示例,方便大家使用,有助于更好的理解深度学习的过程,尤其是每层的结果。 神经网络各层特征图可视化的好处和特点如下: 可视化过程可以了解网络对图像像素的权重分布,可以了解网络对图像特征的提取过程,还可以

    2024年02月04日
    浏览(47)
  • 神经网络基础-神经网络补充概念-49-adam优化算法

    Adam(Adaptive Moment Estimation)是一种优化算法,结合了动量梯度下降法和RMSProp的优点,用于在训练神经网络等深度学习模型时自适应地调整学习率。Adam算法在深度学习中广泛应用,通常能够加速收敛并提高模型性能。 Adam算法综合了动量(momentum)和均方梯度的移动平均(RMS

    2024年02月12日
    浏览(31)
  • 【环境搭建】MacOS系统M1芯片从零开始安装torch torch-geometric(PyG) torch-sparse torch-scatter步骤详解、配置图神经网络(GNN)训练环境教程

    前言:实际上只装PyTorch或者torch不会遇到什么问题,但是torch-geometric、torch-scatter、torch-sparse在M1 chip的Mac上非常难安装( PyG DocumentationInstallation 里注明了“Conda packages are currently not available for M1/M2/M3 macs”)。博主试错过程中遇到了很多无解的bug,还把conda搞炸了,最终不得不

    2024年02月02日
    浏览(40)
  • 神经网络小记-优化器

    优化器是深度学习中用于优化神经网络模型的一类算法,其主要作用是根据模型的损失函数来调整模型的参数,使得模型能够更好地拟合训练数据,提高模型的性能和泛化能力。优化器在训练过程中通过不断更新模型的参数,使模型逐步接近最优解。 具体来说,优化器的作用

    2024年02月16日
    浏览(31)
  • 神经网络的优化器

    神经网络的优化器 是用于训练神经网络的一类算法,它们的核心目的是通过改变神经网络的权值参数来最小化或最大化一个损失函数。优化器对损失函数的搜索过程对于神经网络性能至关重要。 作用: 参数更新 :优化器通过计算损失函数相对于权重参数的梯度来确定更新参

    2024年04月28日
    浏览(26)
  • Python实现PSO粒子群优化算法优化BP神经网络回归模型(BP神经网络回归算法)项目实战

    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。 PSO是粒子群优化算法(Particle Swarm Optimization)的英文缩写,是一种基于种群的随机优化技术,由Eberhart和Kennedy于1995年提出。粒子群算法模仿昆虫、

    2024年02月13日
    浏览(50)
  • Python实现猎人猎物优化算法(HPO)优化BP神经网络回归模型(BP神经网络回归算法)项目实战

    说明:这是一个机器学习实战项目(附带 数据+代码+文档+视频讲解 ),如需 数据+代码+文档+视频讲解 可以直接到文章最后获取。 猎人猎物优化搜索算法(Hunter–prey optimizer, HPO)是由Naruei Keynia于2022年提出的一种最新的优化搜索算法。受到捕食动物(如狮子、豹子和狼)和猎物

    2024年02月09日
    浏览(49)
  • 重构Transformer神经网络:优化的自注意力机制和前馈神经网络

    标题:重构Transformer神经网络:优化的自注意力机制和前馈神经网络 摘要: 本论文研究了一种改进的Transformer神经网络模型,该模型使用区别于传统自注意力机制的新型注意力机制,以及优化的前馈神经网络。而且,该模型还引入了非线性激活函数以增强模型的表现力。实验

    2024年02月07日
    浏览(45)
  • BP神经网络优化 | MATLAB基于遗传算法优化BP神经网络(GA-BP)的预测模型(含完整代码)

    文章目录 前言 一、遗传算法描述 二、优化思路 三、完整代码 预测结果  首先需要安装一下遗传算法工具箱,可参考这篇博客 MATLAB遗传算法工具箱安装包及安装方法(图解)_周杰伦今天喝奶茶了吗的博客-CSDN博客_matlab遗传算法工具箱安装 本模型可以结合自己的数据集进行

    2024年02月02日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包