首页 > 其他分享 >Pytorch 中的 优化器

Pytorch 中的 优化器

时间:2024-08-29 15:57:10浏览次数:11  
标签:loss optim torch 算法 Pytorch 参数 优化

1. 介绍

torch.optim 是PyTorch库中的一个优化器模块,用于实现各种优化算法。优化器模块提供了一系列优化算法,如随机梯度下降(SGD)、Adam、Adagrad 等。这些优化算法用于调整神经网络的权重和学习率,以最小化损失函数。通过优化算法,可以帮助神经网络更快地收敛到最优解,提高训练效率和准确率。

2. 常见的优化算法

1. SGD 算法

class torch.optim.SGD(params, lr=0.001, momentum=0, dampening=0, weight_decay=0, nesterov=False, *, maximize=False, foreach=None, differentiable=False, fused=None)

optim.SGD 是 torch.optim 模块中的随机梯度下降(SGD)优化器类。它的参数介绍如下:

  • params:包含网络参数的可迭代对象。通常使用模型的 parameters() 方法来获取网络的参数。 eg: SGD(myModule_1.parameters(),lr=0.01)  来优化模型的所有参数
  • lr:学习率(learning rate),用于控制权重更新的步长。默认值为0.001。
  • momentum:动量参数,用于加速梯度下降算法。默认值为0。
  • dampening:动量的抑制因子。默认值为0。
  • weight_decay:权重衰减参数,用于控制模型的正则化项。默认值为0。
  • nesterov:是否使用 Nesterov 动量。默认值为False。

SGD 优化器通过调整网络的权重来最小化损失函数,核心思想是通过计算损失函数的梯度,沿着梯度的反方向更新网络的权重,从而逐步接近最优解。学习率决定了每次更新的步长,动量则决定了更新方向的惯性。通过调整学习率和动量的大小,可以影响优化过程的速度和稳定性。

 注意:在使用时 需要:

optim = torch.optim.SGD(myModule_1.parameters(),lr=0.01) 

# 模型优化的步骤:

#  首先 需要将 数据清零,再进行反向传播与优化

optim.zero_grad() # 将 数据 清零
result_loss.backward() # 反向传播,求出每个节点的梯度
optim.step()      # 进行调优

 示例:

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

input = torchvision.datasets.CIFAR10("../TorchVersion/dataset",train=True,
                                     transform=torchvision.transforms.ToTensor(),download=True)
dataloader = DataLoader(input,batch_size=64)

class myModule(nn.Module):
    def __init__(self):
        super(myModule, self).__init__()
        self.module1 = 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.module1(x)
        return x

myModule_1 = myModule()
cross_loss = CrossEntropyLoss()
optim = torch.optim.SGD(myModule_1.parameters(),lr=0.01)

for epoch in range(10):
    running_loss = 0.0
    for data in dataloader:
        img, target = data
        output = myModule_1(img)
        result_loss = cross_loss(output,target)

        optim.zero_grad() # 将 数据 清零
        result_loss.backward() # 反向传播,求出每个节点的梯度
        optim.step()      # 进行调优

        # 计算每一 epoch 的损失总值,判断是否完成了优化
        running_loss = running_loss + result_loss
    print(running_loss)

 2. Adam 算法

class torch.optim.Adam(params, lr=0.001, betas=(0.9, 0.999), eps=1e-08, weight_decay=0, amsgrad=False, *, foreach=None, maximize=False, capturable=False, differentiable=False, fused=None)

  • params‌:这是一个包含模型参数的迭代器,或者是定义了参数组的字典。这些参数是在训练过程中需要被优化的变量。
  • lr‌(学习率):一个浮点数,表示每个参数更新的步长。学习率是一个重要的超参数,它决定了模型在学习过程中的速度和稳定性。
  • betas‌:一个包含两个浮点数的元组,通常设置为(0.9, 0.999)。这两个值分别控制一阶矩估计和二阶矩估计的指数移动平均的系数。它们有助于调整优化器的动量。
  • eps‌:一个小的正数,用于增加数值计算的稳定性。默认值为10−810^{-8}10−8。
  • weight_decay‌:一个浮点数,表示权重衰减(L2正则化)的系数。权重衰减有助于防止过拟合,通过在损失函数中添加权重的平方和来实现。

Adam算法是在2014年提出的一种基于一阶梯度的优化算法,它结合了动量(Momentum)和RMSprop(Root Mean Square Propagation)的思想,自适应地调整每个参数的学习率。

Adam算法的核心在于计算每个参数的一阶矩(即梯度的均值)和二阶矩(即梯度的未中心化方差)的指数移动平均,并利用这些矩的估计值来调整每个参数的学习率。

Adam 算法梯度的对角缩放(diagonal rescaling)具有不变性,因此很适合求解带有大规模数据或参数的问题。该算法同样适用于解决大噪声和稀疏梯度的非稳态(non-stationary)问题。超参数可以很直观地解释,并只需要少量调整。

标签:loss,optim,torch,算法,Pytorch,参数,优化
From: https://blog.csdn.net/SILVERCROWNAGE/article/details/141362800

相关文章

  • Pytorch 的 损失函数
    1.损失函数损失函数(LossFunction)是用来衡量模型预测结果与真实值之间的差异的函数。它是训练过程中最重要的组成部分之一,用来指导模型的优化过程。 作用损失函数的作用包括:衡量模型性能:通过计算预测结果与真实值的差异,损失函数可以提供一个衡量模型预测准确性的指标......
  • Pytorch 中的 Sequential
    1.介绍在PyTorch中,Sequential是一个模型容器。它是一个用于顺序排列神经网络模块(如层、激活函数等)的容器。通过使用Sequential,可以将多个模块按照顺序连接在一起,构建一个深度神经网络模型。使用Sequential时,可以将每个模块按照顺序添加到Sequential容器中。每个模块都可以......
  • 虚幻5|技能栏UI优化(2)——优化技能UI并实现技能栏的拖拽操作
    这篇文章里,前情提要,文章里的序列变量应命名为序号,我命名错了,虽然不差,但为了后面更好的理解一.刷新技能栏,用于刷新上一章文章的初始化技能栏1.打开技能栏格子,打开图表,添加以下两个变量并添加以下蓝图还有一个蓝图要删掉,该图片把右侧的技能图标get有效变量删掉,我这里忘删了......
  • GEE 更新和优化:利用GEE在线处理1985-2024年NDVI、EVI、SAVI、NDMI等指数归一化教程!(Lan
    简介本次的归一化教程,优化了数据去云,预处理等过程,同事将landsat5/7/8集合分别进行了数据整合,也就是原始波段的处理,从而我们可以调用1985-至今任何一个时期的影像进行归一化处理。具体的原文介绍请看原始的博客原始博客利用GEE(GoogleEarthEngine)在线处理NDVI、EVI、SAVI......
  • 拉格朗日插值优化 DP 做题笔记
    本来想在洛谷题单里找斜率优化DP的,然后发现了一个拉格朗日插值优化DP的题单,就点进去尝试了一下。题单。于是先看了雨兔的题解,学了CF995F的做法,然后A了这个题。雨兔题解的链接和我的代码见CF上的提交记录。现在正在做后面的题。P3643[APIO2016]划艇\(a_i,b_i......
  • 【性能优化】:设计模式与技术方案解析(二)
    引言在【性能优化】:探索系统瓶颈的根源(一)文章中,我们已经分析了手动结算的弊端和瓶颈,本文来分析下怎么优化系统性能。需求分析既然手动结算耗时费力易出错,那么能不能开发一个**程序自动化处理**呢?如果要开发一个自动化跑批的程序,核心功能点是什么呢?第一:需要能正常运行;......
  • 博客园-awescnb插件-geek皮肤优化--浏览器ico图标修改
    简介通过js方式自定义修改博客园-awescnb插件-geek皮肤下浏览器ico图标图标准备准备自定义的图标,上传至博客园个人的相册中代码注入定义自定义HTML:博客园->管理->设置->页脚HTML代码添加相关代码//更换ico图标functionupdateICO(){varlink=docum......
  • 从零开始的PyTorch【03】:优化你的神经网络模型
    从零开始的PyTorch【03】:优化你的神经网络模型前言欢迎回到PyTorch学习系列的第三篇!在前两篇文章中,我们学习了如何构建一个简单的神经网络并训练它,同时探索了数据集调整对模型性能的影响。今天,我们将深入探讨如何优化你的神经网络模型,使其在更复杂的任务中表现更好。我们......
  • 如何选择合适的Java集合类来优化性能
    在Java开发中,选择合适的集合类是优化应用程序性能的关键之一。由于不同的集合类在时间复杂度、内存占用和操作效率上各有特点,错误的选择可能会导致严重的性能问题。这篇博客将探讨如何根据具体需求选择合适的Java集合类,以最大化性能优化。1.明确需求在选择集合类之前,首先要......
  • openGauss-子事务并发回滚流程优化
    openGauss-子事务并发回滚流程优化可获得性本特性自openGauss5.1.0版本开始引入。特性简介本特性利用ProcArrayGroup数据结构管理所有抢占ProcArrayLock锁失败的backends,由第一个进入group的backend作为groupleader负责请求ProcArrayLock锁,并在获取到锁后清理group中所有ba......