当前位置: 首页 > article >正文

PyTorch自动微分知识点讲解

PyTorch自动微分知识点讲解知识导图PyTorch自动微分 ├── 基础认知 │ ├── 自动微分的核心概念 │ └── autograd模块的作用 ├── 梯度计算 │ ├── 梯度计算的规则 │ └── backward与grad的使用 └── 实战案例 ├── 单参数的更新 └── 多参数的更新核心名词解释自动微分 (AD)PyTorch 的核心功能用来自动计算函数的梯度不需要手动求导简化了神经网络的训练。autogradPyTorch 的自动微分模块实现了自动梯度计算支持反向传播。反向传播神经网络的训练算法通过损失函数的梯度来更新模型的参数autograd 模块实现了这个过程的自动化。requires_grad张量的属性用来标记是否需要对这个张量计算梯度开启自动微分。backward()反向传播的方法用来自动计算梯度调用后会自动计算所有需要梯度的张量的梯度。grad张量的属性用来存储计算得到的梯度值每次调用 backward 后会累加。梯度清零因为 grad 会累加所以每次训练前需要把梯度清零避免上一次的梯度影响本次的计算。一、自动微分基础认知本章节学习目标掌握自动微分模块的使用1.1 什么是自动微分自动微分Automatic Differentiation, AD 是 PyTorch 的核心功能之一它通过 autograd 模块实现无需手动计算梯度极大简化了神经网络训练等依赖梯度优化的任务。1.2 autograd 模块的作用训练神经网络时最常用的算法就是反向传播。在该算法中参数模型权重会根据损失函数关于对应参数的梯度进行调整。PyTorch 内置的名为torch\.autograd的微分模块它支持自动梯度计算我们可以通过backward方法、grad属性来实现梯度的计算和访问。二、梯度的基本计算梯度计算的规则PyTorch 的梯度计算有以下规则PyTorch 不支持向量张量对向量张量的求导只支持标量张量对向量张量的求导如果 x 是张量那么 loss 必须是标量一个值才可以进行求导计算梯度调用loss\.backward\(\)其中 loss 是一个标量张量获取 x 点的梯度值x\.grad注意它会累加上一次的梯度值所以经常要提前梯度清零三、自动微分实战案例3.1 单参数的更新我们先来看单参数的自动微分更新只更新权重 w** 一次神经网络训练的全流程初始化参数→前向算损失→反向算梯度→梯度下降更新参数。 *# 导包* import torch *# todo 1 模拟初始化权重参数* w torch.tensor(data2.0, requires_gradTrue) *# 只有浮点型的张量才能跟踪梯度这也是为什么我们用2.0而不是2* *# todo 2 模拟损失函数计算损失* loss 2*w**2 print(损失值:, loss) *# 输出: tensor(8., grad_fnMulBackward0)* *# 这里的grad_fnMulBackward0就是autograd的跟踪标记* *# 它记录了这个loss是怎么算出来的反向传播的时候就靠这个算梯度* *# todo 3 反向传播自动计算梯度* loss.backward() *# 这一步就是我们之前聊的自动微分反向传播算完的梯度会自动存到w.grad里* print(w的梯度:, w.grad) *# 输出: tensor(8.)* *# 手动验证一下损失函数是 loss2w²它的导数是 dloss/dw 4w* *# w初始是2所以导数就是 4*28和autograd自动算的完全一致* *# --------------------------* *# todo 4 参数更新梯度下降* *# --------------------------* lr 0.01 *# 学习率* print(f更新前的w: {w.data}) *# 输出: 更新前的w: 2.0* *# 正确的更新公式w w - 学习率 * 梯度* w.data w.data - lr * w.grad print(f更新后的w: {w.data}) *# 输出: 更新后的w: 1.92* 补充两个实际开发的注意点 为什么更新参数要用w.data 因为如果直接写w w - lr * w.grad会新建一个普通的张量把原来带requires_grad的参数张量覆盖掉之后就没法跟踪梯度了。用.data可以直接修改张量的数值同时保留它的梯度跟踪属性。 梯度要清零 如果你要跑第二次训练一定要把上一次的梯度清零不然梯度会累加比如你再跑一次loss.backward()w.grad 会变成 16而不是重新计算。 实际开发中优化器会自动帮你做optimizer.zero_grad()不用你手动清。 ** 一次神经网络训练的全流程初始化参数→前向算损失→反向算梯度→梯度下降更新参数。 *# 导包* import torch *# todo 1 模拟初始化权重参数* w torch.tensor(data[2.0,4.0], requires_gradTrue) *# 只有浮点型的张量才能跟踪梯度这也是为什么我们用2.0而不是2* *# todo 2 模拟损失函数计算损失* loss 2*w**2 print(损失值:, loss) *# 输出: tensor([ 8., 32.], grad_fnMulBackward0)* *# 这里的grad_fnMulBackward0就是autograd的跟踪标记* *# 它记录了这个loss是怎么算出来的反向传播的时候就靠这个算梯度* *# todo loss 必须是标量张量,否则用它的均值* *# todo 3 反向传播自动计算梯度* loss.mean().backward() *# sum、mean* *# 这一步就是我们之前聊的自动微分反向传播算完的梯度会自动存到w.grad里* print(w的梯度:, w.grad) *# 输出:w的梯度: tensor([4., 8.])* *# 手动验证一下损失函数是 loss2w²它的导数是 dloss/dw 4w* *# w初始是2所以导数就是 4*28和autograd自动算的完全一致* *# --------------------------* *# todo 4 参数更新梯度下降* *# --------------------------* lr 0.01 *# 学习率* print(f更新前的w: {w.data}) *# 输出: 更新前的w: 2.0* *# 正确的更新公式w w - 学习率 * 梯度* w.data w.data - lr * w.grad *# 2-0.01*4* *# 4-0.01*8* print(f更新后的w: {w.data}) *# 输出: 更新后的w: 1.92* * # 更新后的w: tensor([1.9600, 3.9200])* 补充两个实际开发的注意点 为什么更新参数要用w.data 因为如果直接写w w - lr * w.grad会新建一个普通的张量把原来带requires_grad的参数张量覆盖掉之后就没法跟踪梯度了。用.data可以直接修改张量的数值同时保留它的梯度跟踪属性。 梯度要清零 如果你要跑第二次训练一定要把上一次的梯度清零不然梯度会累加比如你再跑一次loss.backward()w.grad 会变成 16而不是重新计算。 实际开发中优化器会自动帮你做optimizer.zero_grad()不用你手动清。 3.2 多参数的更新接下来我们看同时更新权重 w 和偏置 b 的案例import torch torch.manual_seed(6) *# todo 1 初始化参数* *# 1模拟x数据 --真实特征* x torch.ones(size (5,3)) *# 2模拟y 数据* y torch.zeros(size(2,3)) *# 3模拟初始化w数据* w torch.randn(size(2,5),requires_gradTrue) *# 4模拟初始化b数据* b torch.randn(3,requires_gradTrue) *# 5计算z标签* z wx b print(z.shape) *# torch.Size([2, 3]) -y* *# 6损失函数* loss_fn torch.nn.MSELoss() *# 7) 学习率* lr 0.01 *# todo 2 前向算损失* loss loss_fn(z,y) print(f损失值{loss}) *# loss 13.9481782913208* *# todo 3 反向算梯度* loss.backward() *# -w.grad* print(fw的梯度{w.grad}) print(fb的梯度{b.grad}) *# todo 4 梯度下降更新参数 新 旧 - 学习率*梯度* print(f更新前的w:{w}) w w - 0.01*w.grad print(f更新后前的w:{w}) print(-------------------------) print(f更新前的b:{b}) b b - 0.01*b.grad print(f更新后前的b:{b})四、知识点小结本小节主要讲解了 PyTorch 中非常重要的自动微分模块的使用和理解。我们对需要计算梯度的张量需要设置requires\_gradTrue属性这样 autograd 模块就会自动跟踪这个张量的运算在反向传播的时候自动计算梯度。

相关文章:

PyTorch自动微分知识点讲解

PyTorch自动微分知识点讲解 知识导图 PyTorch自动微分 ├── 基础认知 │ ├── 自动微分的核心概念 │ └── autograd模块的作用 ├── 梯度计算 │ ├── 梯度计算的规则 │ └── backward与grad的使用 └── 实战案例├── 单参数的更新└── 多参数的更…...

互联网大厂 Java 求职面试技巧揭秘

互联网大厂 Java 求职面试技巧揭秘 在当今互联网大厂求职面试中,技术与场景的交汇点常常成为面试官考察的重点。本文将通过一位搞笑的程序员燕双非与严肃的面试官的对话,展示 Java 技术栈下的面试问题,并深入解答其中的技术要点。第一轮面试 …...

MCP密钥安全管理的无侵入解决方案:mcp-safe-run工具详解

1. 项目概述:告别硬编码,拥抱安全的MCP密钥管理如果你和我一样,日常开发中深度依赖Claude、Cursor、Windsurf这类智能编码助手,那你肯定对Model Context Protocol(MCP)不陌生。MCP作为连接AI模型与外部工具…...

解密智能工具:3步实现Windows高效安装Android应用

解密智能工具:3步实现Windows高效安装Android应用 【免费下载链接】APK-Installer An Android Application Installer for Windows 项目地址: https://gitcode.com/GitHub_Trending/ap/APK-Installer 在数字生活日益融合的今天,你是否曾为Windows…...

Python开发进阶之路:探索异步编程与高性能应用

在当今快节奏的软件开发环境中,构建高性能、可扩展的应用程序已成为开发者的首要任务。随着互联网应用的普及,用户对响应速度和并发处理能力的要求越来越高。Python,作为一种广泛使用的高级编程语言,凭借其简洁的语法和强大的生态…...

基于多平台行为数据构建AI Agent深度用户画像:Know Your Owner项目解析

1. 项目概述:从“你是谁”到“我懂你”的智能跨越在AI助手日益普及的今天,我们面临着一个核心矛盾:用户期望获得高度个性化的服务,而AI助手在初次接触时却对用户一无所知。传统的解决方案,比如让用户填写冗长的问卷&am…...

工程师的调试礼仪:如何避免一次问候毁掉两小时工作成果

1. 项目概述:一次关于“Bug礼仪”的职场博弈在硬件开发的深水区,尤其是在产品临近交付的冲刺阶段,工程师与管理者之间的互动,往往比电路板上的信号完整性更考验“设计”。这不是一个关于具体芯片型号或调试命令的技术教程&#xf…...

从零粉丝到行业KOL,ChatGPT驱动的LinkedIn内容矩阵搭建全链路,含17个已验证Prompt模板+3类避坑清单

更多请点击: https://intelliparadigm.com 第一章:从零粉丝到行业KOL的底层认知跃迁 成为技术领域有影响力的声音,从来不是靠日更三篇“速成教程”,而是源于对价值创造逻辑的重构。当多数人还在纠结“选什么平台”“起什么昵称”…...

iPhone 5s系统工程解析:LPDDR3内存与E2NAND存储的协同进化

1. 项目概述:iPhone 5s,一场被低估的系统性工程胜利2013年9月,当苹果发布iPhone 5s时,聚光灯几乎全部打在了那个划时代的64位A7处理器上。媒体和消费者的讨论都围绕着“桌面级性能”和“移动计算新时代”展开。作为一名在消费电子…...

深夜“哔哔”声源排查指南:从原理到实战解决电子设备异响

1. 深夜“哔哔”声的普遍困扰与根源剖析你有没有在凌晨三点被一阵微弱但执着的“哔哔”声从睡梦中拽出来过?那种感觉,就像有个看不见的小精灵在你家天花板的某个角落,每隔一分钟就用气声对你进行一次精准的精神攻击。你猛地坐起,睡…...

IP2366至为芯支持C口双向快充的140W多串锂电池充放电SOC芯片

英集芯IP2366是一款应用于移动电源、电动工具、智能家居、储能电源等方案的多串锂电池充电SOC芯片。支持高达140W的双向同步升降压充放电,充电电流可达5A。支持2至6节锂电池/磷酸铁锂电池串联,集成PD3.1、QC3.0等多种快充协议。内置14bit ADC&#xff0c…...

Versal AI Engine加速椭圆曲线密码学计算实践

1. 项目概述:Versal AI Engine加速椭圆曲线密码学计算在当今的数字安全领域,椭圆曲线密码学(ECC)因其高安全性和计算效率成为主流方案。其中,多标量乘法(MSM)作为ECC的核心运算,在零…...

企业级AI应用如何通过Taotoken统一管理多个大模型API调用

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 企业级AI应用如何通过Taotoken统一管理多个大模型API调用 在构建企业级AI应用时,技术团队常常面临一个现实挑战&#x…...

WordPress集成Claude AI:构建智能内容创作技术栈的实践指南

1. 项目概述与核心价值最近在折腾个人博客和内容创作工具链,发现了一个挺有意思的GitHub项目:mvtandas/wordpress-claude-stack。这名字一看就很有料,直接把WordPress和Claude这两个看似不搭界的玩意儿给“堆”到了一起。作为一个常年混迹在内…...

《QGIS空间数据处理与高级制图》008:OGR2OGR命令行工具核心优势

作者:翰墨之道,毕业于国际知名大学空间信息与计算机专业,获硕士学位,现任国内时空智能领域资深专家、CSDN知名技术博主。多年来深耕地理信息与时空智能核心技术研发,精通 QGIS、GrassGIS、OSG、OsgEarth、UE、Cesium、OpenLayers、Leaflet、MapBox 等主流工具与框架,兼具…...

【YOLO26实战全攻略】20——智慧交通(二):团雾识别+车流量统计全流程落地

摘要:团雾作为高速公路"流动杀手",常导致能见度骤降、事故频发,而传统监测手段响应滞后、统计粗放;车流量数据则是交通管控的核心依据,但精细化分类统计一直是行业痛点。本文基于YOLO26的边缘友好特性,结合FAENet特征增强网络与ByteTrack跟踪算法,打造了一套&…...

FastAPI部署演进:从Gunicorn+Uvicorn镜像到原生多进程的迁移指南

1. 项目背景与演进:从“黄金搭档”到“历史遗产”如果你在过去几年里用 FastAPI 部署过 Web 服务,大概率听说过或者用过tiangolo/uvicorn-gunicorn-fastapi-docker这个 Docker 镜像。它一度是 FastAPI 官方文档里推荐的部署方案之一,由 FastA…...

VSCode写Verilog效率翻倍:除了语法检查,再教你用Python插件自动生成模块例化

VSCode写Verilog效率翻倍:Python插件自动化实战指南 在FPGA开发中,Verilog代码的重复性劳动往往消耗工程师大量时间。我曾在一个图像处理项目中被模块例化折磨得焦头烂额——手动编写30多个相同结构的FIFO例化代码,不仅容易出错,后…...

告别网盘限速困扰:网盘直链下载助手全面解析与应用指南

告别网盘限速困扰:网盘直链下载助手全面解析与应用指南 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 还在为网盘下载速度缓慢而烦恼吗?网盘直链下载助手作为一款免费…...

EDA工具选型实战:从价格到价值的深度迁移指南

1. 从价格战到价值战:一次EDA工具市场策略的深度复盘十年前,当Altium宣布将其旗舰PCB设计软件Altium Designer的价格下调约75%时,整个电子设计自动化(EDA)圈子都炸开了锅。这无异于在由Cadence、Mentor Graphics&#…...

开关电源EMC设计:从原理到实践的关键技术

1. 开关电源EMC设计基础 开关电源因其高效率和小型化优势,在现代电子设备中广泛应用。然而,高频开关动作带来的电磁干扰(EMI)问题不容忽视。作为一名电源工程师,我经常需要面对各种EMC挑战。记得有一次,我们团队设计的工业电源模块…...

终极暗黑2存档编辑器:5分钟学会免费修改d2s文件的完整指南

终极暗黑2存档编辑器:5分钟学会免费修改d2s文件的完整指南 【免费下载链接】d2s-editor 项目地址: https://gitcode.com/gh_mirrors/d2/d2s-editor 你是否曾因暗黑破坏神2的角色属性分配不当而懊恼?是否因稀有装备难以获取而沮丧?d2s…...

告别硬件依赖:用Virtual ZPL Printer构建完整的标签打印测试环境

告别硬件依赖:用Virtual ZPL Printer构建完整的标签打印测试环境 【免费下载链接】Virtual-ZPL-Printer An ethernet based virtual Zebra Label Printer that can be used to test applications that produce bar code labels. 项目地址: https://gitcode.com/gh…...

多重细胞因子检测及其技术综述

一、细胞因子概述细胞因子是一类由免疫细胞(如单核细胞、巨噬细胞、T细胞、B细胞及自然杀伤细胞等)及部分非免疫细胞(如内皮细胞、表皮细胞、成纤维细胞等)在相应刺激诱导下合成并分泌的小分子蛋白质,具有广泛的生物学…...

OpenClaw-Skills:模块化自动化技能库的设计、开发与编排实战

1. 项目概述与核心价值最近在GitHub上看到一个挺有意思的项目,叫blessonism/openclaw-skills。光看名字,你可能会有点摸不着头脑,这“OpenClaw”和“Skills”组合在一起,到底想干什么?作为一个在开源社区和自动化工具领…...

FPGA仿真库配置避坑指南:Xilinx 7系、Altera Cyclone V、Lattice ECP5在ModelSim 10.6d下的完整流程

FPGA仿真库配置避坑指南:Xilinx 7系、Altera Cyclone V、Lattice ECP5在ModelSim 10.6d下的完整流程 第一次在ModelSim 10.6d环境下配置FPGA仿真库时,我花了整整三天时间排查各种路径错误和权限问题。直到现在,我还清楚地记得那个深夜——当仿…...

物联网安全创业:从技术挑战到市场机遇的深度解析

1. 物联网安全创业的“冷”与“热”:一个从业者的深度观察作为一名在嵌入式系统和网络安全领域摸爬滚打了十几年的工程师,我几乎见证了物联网从概念炒作到遍地开花的全过程。每次和同行、投资人聊天,话题总绕不开两个极端:一边是对…...

中国地址生成器:快速生成真实地址数据的开发者利器

中国地址生成器:快速生成真实地址数据的开发者利器 【免费下载链接】chinese-address-generator 中国地址生成器 - 三级地址 四级地址 随机生成完整地址 项目地址: https://gitcode.com/gh_mirrors/ch/chinese-address-generator 在开发测试、数据填充、表单…...

在Android Termux中部署轻量级Docker环境:原理、部署与实战指南

1. 项目概述与核心价值最近在折腾移动设备上的开发环境,发现一个挺有意思的项目:George-Seven/Termux-Udocker。简单来说,它是在Android平台的Termux终端模拟器里,实现一个轻量级的、用户空间(User-Space)的…...

电源完整性设计:电容模型、去耦策略与测量验证实战解析

1. 电容与去耦:从概念到实战的深度解析上周我们聊了聊去耦电容在电源完整性设计中的一些基本概念和时机选择,算是开了个头。这周咱们继续深入,把这块硬骨头啃得更透一些。很多工程师,尤其是刚入行的朋友,常常觉得电容选…...