Pytorch 梯度优化问题【Pytorch 基础第二话】

Pytorch中的梯度回传与梯度清零 首先要明确在Pytorch当中,计算得到的梯度是默认累加的,而不是下次计算梯度就自动清零上一次的梯度值。 这样做的好处有以下几点: 1、减小multitask的内存消耗 ​ 在PyTorch中,multi-task任务一个标准的train from scratch流程为: for idx, data in enumerate(train_loader): xs, ys = data pred1 = model1(xs) pred2 = model2(xs) lo 阅读详情

Debug准备:3D绘图

为了方便研究二元图像,我们需要更直观的看到整个图像全貌。我们编写draw3D_func函数。

import numpy as np
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
from matplotlib import cm
from matplotlib.colors import LinearSegmentedColormap

def draw3D_func(func,x_range=np.arange(-6, 6, 0.1),y_range=np.arange(-6, 6, 0.1)):
    X, Y = np.meshgrid(x_range, y_range) #生成网格点坐标矩阵
    Z=func([X,Y])
    ax = plt.gca(projection='3d')
    ax.plot_surface(X, Y, Z)
    ax.view_init(60, -30)
    ax.set_xlabel('x[0]')
    ax.set_ylabel('x[1]')
    plt.show()

求解在定点的梯度值

我们假设函数:f(x1,x2)=−(cos2x1+cos2x2)2f(x_1,x_2)=-(cos^{2}x_1+cos^{2}x_2)^2f(x1​,x2​)=−(cos2x1​+cos2x2​)2,现在我们求X=[π3,π6\frac{\pi}{3},\frac{\pi}{6}3π​,6π​],的 fff 的值和该点的梯度值。
使用 f.backward()

from math import pi
import torch
import torch.optim
from debug import ptf_tensor, draw3D_func

# 示例计算定点梯度
x=torch.tensor([pi/3,pi/6],requires_grad=True)
f = - ((x.cos() ** 2).sum()) ** 2
ptf_tensor(f,'f(x1,x2) value')
f.backward() # 计算梯度
ptf_tensor(x.grad,'f grad') # 点在【pi/3,pi/6】的梯度值

输出结果:

The info of f(x1,x2) value:
#############################
  @dims: 0
  @size: torch.Size([])
  @ele_sum: 1
  @dtype: torch.float32
  @data:
-1.0
#############################


The info of f grad:
#############################
  @dims: 1
  @size: torch.Size([2])
  @ele_sum: 2
  @dtype: torch.float32
  @data:
tensor([1.7321, 1.7321])
#############################

求解当梯度接近0时X的值

我们需要用到torch.optim

import math
from math import pi
import torch
import torch.optim
from debug import ptf_tensor, draw3D_func

# 示例迭代梯度
def func(x):
    return - ((x.cos() ** 2).sum()) ** 2 

x=torch.tensor([pi/3,pi/6],requires_grad=True)
f=func(x)

optimizer=torch.optim.SGD([x,],lr=0.1,momentum=0) #momentun是动量,用于解决梯度下降算法的陷入局部极值问题,这里我们暂时不需要
for step in range(11):
    if step:
        optimizer.zero_grad() # 对之前迭代器的数据清空
        f.backward() # 求解梯度
        optimizer.step() #梯度下降迭代
    f=func(x)
    print ('step {}: x = {}, f(x) = {}, grad = {}'.format(step, x.tolist(), f, x.grad))

输出:

step 0: x = [1.0471975803375244, 0.5235987901687622], f(x) = -1.0, grad = None
step 1: x = [0.8739925026893616, 0.35039371252059937], f(x) = -1.674528956413269, grad = tensor([1.7321, 1.7321])
step 2: x = [0.6192374229431152, 0.1835097223520279], f(x) = -2.6563119888305664, grad = tensor([2.5476, 1.6688])
step 3: x = [0.3111077845096588, 0.06654246151447296], f(x) = -3.617122173309326, grad = tensor([3.0813, 1.1697])
step 4: x = [0.08941137790679932, 0.016069628298282623], f(x) = -3.9671425819396973, grad = tensor([2.2170, 0.5047])
step 5: x = [0.01855570822954178, 0.0032690390944480896], f(x) = -3.99858021736145, grad = tensor([0.7086, 0.1280])
step 6: x = [0.0037171822041273117, 0.0006542906630784273], f(x) = -3.999943256378174, grad = tensor([0.1484, 0.0261])
step 7: x = [0.0007434850558638573, 0.00013086199760437012], f(x) = -3.999997615814209, grad = tensor([0.0297, 0.0052])
step 8: x = [0.00014869740698486567, 2.617243444547057e-05], f(x) = -4.0, grad = tensor([0.0059, 0.0010])
step 9: x = [2.973947994178161e-05, 5.234485797700472e-06], f(x) = -4.0, grad = tensor([0.0012, 0.0002])
step 10: x = [5.947895260760561e-06, 1.0468970685906243e-06], f(x) = -4.0, grad = tensor([2.3792e-04, 4.1876e-05])

可以看到在第十次的grad已经非常接近0了,这时x取到[0,0]

其他优化算法Adam

我们利用Adam实现对himmelblau函数进行优化。
f(x)=((x02+x1−11)2+(x0+x1)2−7)2f(x)=((x_0^2+x_1-11)^2+(x_0+x_1)^2-7)^2f(x)=((x02​+x1​−11)2+(x0​+x1​)2−7)2
利用draw3D画出函数图像:
himmelblau
这个函数具用四个局部极小值点和一个局部最大值点。
考虑到它具用四个极小值点,所以我们从不同的地方出发可能会导致我们去到的地方不一致。
需要注意的是Adam函数不需要手动设置学习率,它会自动计算学习率。

import math
from math import pi
import torch
import torch.optim
from debug import ptf_tensor, draw3D_func

def himmelblau(x):
    return (x[0]**2+x[1]-11)**2+(x[0]+x[1]**2-7)**2

draw3D_func(himmelblau) # 绘制函数图像
x=torch.tensor([0.,0.],requires_grad=True)
optimizer=torch.optim.Adam([x,])

for step in range(20001):
    if step:
        optimizer.zero_grad()
        f.backward() # f.backward() 找局部最小值,我们只需要利用相反(-f).backward()就能求局部最大值
        optimizer.step()
    f=himmelblau(x)
    if step % 1000 ==0:
      print ('step {}: x = {}, f(x) = {}, grad = {}'.format(step, x.tolist(), f, x.grad))  

输出:

step 0: x = [0.0, 0.0], f(x) = 170.0, grad = None
step 1000: x = [1.270142912864685, 1.1183991432189941], f(x) = 88.42720031738281, grad = tensor([-50.9531, -36.5798])
step 2000: x = [2.332378387451172, 1.9535712003707886], f(x) = 13.730916023254395, grad = tensor([-35.3822, -13.8925])
step 3000: x = [2.8519949913024902, 2.114161968231201], f(x) = 0.6689231395721436, grad = tensor([-7.9508,  1.2138])
step 4000: x = [2.981964111328125, 2.0271568298339844], f(x) = 0.014858869835734367, grad = tensor([-0.7824,  0.5803])
step 5000: x = [2.9991261959075928, 2.0014777183532715], f(x) = 3.956971340812743e-05, grad = tensor([-0.0352,  0.0329])
step 6000: x = [2.999983549118042, 2.0000221729278564], f(x) = 1.1074007488787174e-08, grad = tensor([-0.0008,  0.0004])
step 7000: x = [2.9999899864196777, 2.000013589859009], f(x) = 4.150251697865315e-09, grad = tensor([-0.0005,  0.0003])
step 8000: x = [2.9999938011169434, 2.0000083446502686], f(x) = 1.5572823031106964e-09, grad = tensor([-0.0003,  0.0002])
step 9000: x = [2.9999964237213135, 2.000005006790161], f(x) = 5.256879376247525e-10, grad = tensor([-1.6212e-04,  9.7275e-05])
step 10000: x = [2.999997854232788, 2.000002861022949], f(x) = 1.8189894035458565e-10, grad = tensor([-9.5367e-05,  5.7221e-05])
step 11000: x = [2.9999988079071045, 2.0000014305114746], f(x) = 5.547917680814862e-11, grad = tensor([-5.9128e-05,  2.6703e-05])
step 12000: x = [2.9999992847442627, 2.0000009536743164], f(x) = 1.6370904631912708e-11, grad = tensor([-2.8610e-05,  1.7166e-05])
step 13000: x = [2.999999523162842, 2.000000476837158], f(x) = 5.6843418860808015e-12, grad = tensor([-2.0027e-05,  7.6294e-06])
step 14000: x = [2.999999761581421, 2.000000238418579], f(x) = 1.8189894035458565e-12, grad = tensor([-9.5367e-06,  5.7220e-06])
step 15000: x = [3.0, 2.0], f(x) = 0.0, grad = tensor([0., 0.])
step 16000: x = [3.0, 2.0], f(x) = 0.0, grad = tensor([0., 0.])
step 17000: x = [3.0, 2.0], f(x) = 0.0, grad = tensor([0., 0.])
step 18000: x = [3.0, 2.0], f(x) = 0.0, grad = tensor([0., 0.])
step 19000: x = [3.0, 2.0], f(x) = 0.0, grad = tensor([0., 0.])
step 20000: x = [3.0, 2.0], f(x) = 0.0, grad = tensor([0., 0.])

各种优化算法总览:
optim

PyTorch使用Tricks:梯度裁剪-防止梯度爆炸或梯度消失 !! 梯度裁剪(Gradient Clipping)是一种防止梯度爆炸或梯度消失的优化技术,它可以在反向传播过程中对梯度进行缩放或截断,使其保持在一个合理的范围内。按照梯度的绝对值进行裁剪,即如果梯度的绝对值超过了一个阈值,就将其设置为该阈值的符号乘以该阈值。按照梯度的范数进行裁剪,即如果梯度的范数超过了一个阈值,就将其按比例缩小,使其范数等于该阈值。例如,如果阈值为1,那么梯度的范数就是1。在PyTorch中,可以使用和这两个函数来实现梯度裁剪,它们都是在梯度计算完成后,更新权重之前调用的。 阅读详情

相关推荐

pytorch禁止/允许计算局部梯度

一、禁止计算局部梯度 torch.autogard.no_grad: 禁用梯度计算的上下文管理器。 当确定不会调用Tensor.backward()计算梯度时,设置禁止计算梯度会减少内存消耗。如果需要计算梯度设置Tensor.requires_grad=True 两种禁用方法: 将不用计算梯度的变量放在with torch.no_grad()里 >>> x = torc...

Answer3664的博客 1万+

C#部署基于pytorch的图像神经网络分类模型,实现本地化推理

基于C#、TorchSharp、TorchScript、Pytorch部署基于图像神经网络分类模型,并实现本地化推理

qq_41858327的博客 5558

PyTorch基础:使用C#构建神经网络工具箱torch.nn

PyTorch提供了一个强大的神经网络工具箱torch.nn,其中包含了许多用于构建和训练神经网络的模块和函数。在本文中,我们将介绍如何使用C#编写神经网络工具箱torch.nn的基础知识。我们将提供完整的源代码和相应的描述,以帮助您更好地理解和使用PyTorch。在C#中使用PyTorch的神经网络工具箱torch.nn,我们需要先安装相关的库和依赖项。通过以上示例,我们展示了如何使用C#编写神经网络工具箱torch.nn的基础知识。方法,我们可以得到网络的输出结果,并将其打印出来。

XisVisual_Basic的博客 836

C#(winform)调用pytorch模型

winform调用pytorch上训练好的unet模型: 项目是写一个辅助诊断系统软件,用winform写软件,调用pytorch和matlab的模型。这篇博客只包含调用pytorch模型的部分。 1.c++(libtorch)调用模型 2.c++生成动态链接库 3.c#调用dll 1. libtorch(cpu)调用gpu模型 首先把pytorch的模型转成libtorch的。如果模型没有控制流(if-else语句),就用简单的trace方式进行转换。 pth文件转为pt文件 import torch

aquamarine_的博客 1万+

Silvaco Atlas从头开始(四)——定义材料参数和模型

这部分是关于定义材料参数和模型。

qsz1425AWD2121的博客 4649

离线反激转换器反馈环路设计:从理论到实践的Type II补偿器详解

在开关电源设计中,反馈环路稳定性是决定电源性能与可靠性的核心。其本质是通过补偿网络对功率级的小信号特性进行校正,以构建一个具有足够相位裕度和增益裕度的闭环系统。反激转换器作为一种广泛应用的隔离拓扑,其功率级在连续导通模式(CCM)和非连续导通模式(DCM)下呈现不同的零极点特性,这直接决定了补偿器的选型。Type II补偿器因其传递函数中固有的积分环节、低频零点与高频极点,恰好能与反激功率级的1P2Z(一个极点、两个零点)特性形成互补,有效塑造理想的回路增益曲线,实现快速稳定的动态响应。本文聚焦于采用TL4

weixin_30162121的博客 501

第2章 PyTorch基础(1/2)

PyTorch基础:主要介绍张量运算、计算图、自动求导等内容。

wumg3000的博客 874

VH6501实战:手把手教你用CANoe脚本精准触发CAN总线干扰(附避坑点)

本文详细介绍了使用VH6501和CANoe脚本精准触发CAN总线干扰的实战技巧,包括触发位置控制、ValidityMask配置和干扰序列设置等关键步骤。通过具体代码示例和常见问题排查指南,帮助工程师避开实际应用中的常见陷阱,提升CAN总线干扰测试的准确性和效率。

weixin_33709219的博客 369

C#调用Python脚本训练并生成AI模型(以Paddle框架为例)

Windows开发时用到AI模型部署,使用C#调用Python脚本训练并生成AI模型

m0_46339652的博客 6928

(三)UPF之Domain Coverage Relationship(Cover、Equivalent、Independent)

整个Soc架构中一般会存在多个Power Domain,不同的Power Domain之间也存在着一定的Coverage关系。在Cadence工具中,这种。不同的Domain Coverage关系中,各个Domain存在着一定的关联()。

Mr.翟的博客 1424

【人工智能之深度学习】21. 自动驾驶感知实战:YOLOv4复杂天气优化方案(BDD100K全代码+效果对比)

摘要:自动驾驶摄像头在雨雾天气下易受图像模糊、目标遮挡影响,导致YOLOv4检测精度骤降。本文基于BDD100K公开数据集(含多天气场景),设计三阶段优化方案:1)物理建模生成雨雾效果(雨滴线条+大气散射模型),将恶劣天气样本占比从20%提升至40%;2)在YOLOv4颈部嵌入CBAM注意力机制,强化模糊区域特征提取;3)L1剪枝(30%)+TensorRT量化实现轻量化。需特别说明:本文为教学虚拟案例,不可直接用于车载部署,实际落地需结合多传感器融合与ISO 26262认证。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1684

pytorch计算图像梯度并作为图像梯度损失训练网络

利用图像梯度损失约束网络能够更好的在图像生成过程中产生更加清晰的纹理细节,但是如何利用pytorch计算图像梯度并作为梯度损失可能在网络优化过程中造成梯度爆炸。本文将阐述如何利用pytorch计算图像梯度并作为图像梯度损失训练网络。

fovever_的博客 9233

华为OD机试 - 最佳对手(Python/JS/C/C++ 2025 A卷 200分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。游戏里面,队伍通过匹配实力相近的对手进行对战。但是如果匹配的队伍实力相差太大,对于双方游戏体验都不会太好。给定n个队伍的实力值,对其进行两两实力匹配,两支队伍实例差距在允许的最大差距d内,则可以匹配。要求在匹配队伍最多的情况下,匹配出的各组实力差

学Java,找哪吒 1379

PyTorch会在每次.backward()调用时会累积梯度的问题

这段代码展示了在PyTorch中如何计算梯度、梯度累积的特性以及清空梯度的重要性。在实际训练模型时,适时清空梯度是保证模型正确学习的关键步骤之一。

qq_37397652的博客 1539

用ChatGPT 5.5掌握SCI的4个实操润色技巧,论文质量极速提升!(附提示词)

ChatGPT 5.5的发布,在学术写作中的应用变得更加精准和安全,通过正确的使用方法,不仅可以改善语法与表达,让论文达到SCI发表水准,还能最大程度保留作者原意,将AIGC检测率控制在低风险区间。可以帮大家省下大量纠结语法、梳理逻辑的时间,在保证润色质量的同时,兼顾AIGC检测的合规要求,为论文投稿成功率提供实实在在的提升。通过智能调整语序、优化用词和句式结构,该方法能够在保留学术质感的同时,使文章表达更自然、贴近人工撰写的风格,从而避免文字过于程式化,提升论文整体可读性和表达的个性化特征。

智能AI让学术科研更容易 64

3、★☛基于STM32的手机通过wifi控LED灯√♠★

3、基于STM32的手机通过wifi控LED灯 文章目录3、基于STM32的手机通过wifi控LED灯1、Introduce介绍1.1、课题背景及其意义1.2、 国内外的研究状况2、方案的设计2.1、控制方案的确定2.2、控制方式的选择2.2.1、 单片机芯片的选择方案一方案二方案三方案四2.2.2、无线遥控模块的选择方案一方案二方案三3、硬件电路的设计3.1、系统的功能分析及体系结构设计3.1.1、系统功能分析3.1.2、系统总体结构3.2、模块电路的设计3.2.1、 STM32单片机核心电路设计3.2.

行走的皮卡丘 2960

pytorch基础【4】梯度计算、链式法则、梯度清零

PyTorch 的自动微分机制使得梯度计算变得简单且高效,通过构建计算图并自动进行反向传播,你可以专注于模型的设计和训练,而不必手动计算复杂的梯度。dydxdydu⋅dudxdxdy​dudy​⋅dxdu​链式法则是微积分中的一个重要法则,它在深度学习中的反向传播算法中起到了关键作用。通过链式法则,我们可以有效地计算复合函数的导数,从而利用梯度下降等优化方法来训练神经网络模型。

wahahaha116的博客 3418

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

pytorch——梯度计算

1、梯度介绍 梯度是一个向量,是学习(参数更新的方向)。收集数据,构建机器学习模型,得到 判断模型好坏的方法: (回归损失) (分类损失) 通过调整参数,尽可能降低 随机选择一个起始点,通过调整,使得函数取得最小值。 的更新方法: ①计算的梯度(即导数): ②更新: 其中,,意味着将增大,,意味着将减小。当小到一定的程度或者循环达到一定次数后,或停止循环。 ...

m0_51311105的博客 9321

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

PyTorch中的梯度累加

PyTorch中的梯度累加。

画心 7042

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

pytorch之梯度累加

可以理解为一个多变量函数的变化率,它告诉我们在某一点上,函数的输出如何随输入的变化而变化。更直观地说,梯度指示了最优化方向。

2303_77275067的博客 1778

Pytorch中的梯度下降及优化

在PyTorch中使用Mini-batch这种方法进行训练 Mini-batch的梯度下降法 对整个训练集进行梯度下降法的时候,我们必须处理整个训练数据集,然后才能进行一步梯度下降,即每一步梯度下降法需要对整个训练集进行一次处理,如果训练数据集很大的时候处理速度会很慢,而且也不可能一次的载入到内存或者显存中 所以我们会把大数据集分成小数据集,一部分一部分的训练,这个训练子集即称为Mini-batc...

Tiiktak‘s 1603

基于PyTorch学AI——自动梯度

简单理解,PyTorch把繁琐的反向传播计算梯度的过程,非常优雅的进行了封装,调用者只需要简单的配置需tensor的requires_grad 属性,配合后续优化器的功能,即可灵活的配置参数优化过程。

道至简 2087

PyTorch 梯度累积:显存省了,优化步长也变了

梯度累积能节省显存,但会影响优化步、学习率调度、梯度裁剪和日志语义。训练配置要写清 micro batch、累积步数、GPU 数和 effective batch。显存省下来以后,还要确认优化过程仍然符合预期。

lady_mumu的博客 4919

Pytorch中的梯度知识总结

你真的了解Pytorch中梯度的计算原理吗?这篇文章主要涉及Pytorch中梯度计算的知识,包括什么是叶子向量,梯度反向传播原理,参数优化过程的详细解释。

梦码城博客中心 4349

【深度学习】pytorch中反向传播,梯度保留,梯度分离,梯度清零,梯度累加等相关问题解析

1.因此,当使用optimizer=optim.Optimizer(net.parameters())设置优化器时,此时优化器中的param_groups等于模型中的parameters(),此时,二者是等效的,从二者的源码中也可以看出来。,得到的这个tensor永远不需要计算其梯度,不具有梯度grad,即使之后重新将它的requires_grad置为true,它也不会具有梯度grad。detach()函数,返回一个新的tensor,是从当前计算图中分离下来的,但是仍指向原变量的存放位置,其。

千禧皓月的博客 6242

深度学习之优化器【从梯度下降到自适应学习率算法】(pytorch版)

深度学习之优化器【从梯度下降到自适应学习率算法】(pytorch版)

缘友一世的博客 1981
上一篇: Pytorch 张量操作(创建,变形,元素选取,拼接)【Pytorch 基础第一话】
下一篇: Pytorch 线性回归(上)【Pytorch 基础第三话】
JintuZheng
博客等级 码龄11年 1483粉丝 109原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值