深度学习3
五、自动微分
1、基础概念
模块 autograd 负责自动计算张量操作的梯度,具有自动求导功能;autograd 创建一个动态计算图来跟踪张量的操作,每个张量是计算图中的一个节点,节点之间的操作构成图的边。
属性 requires_grad 决定是否对张量进行梯度计算,默认不进行。
方法 backward 进行反向传播,计算张量梯度。
tensor.grad 返回梯度值
2、计算梯度
元素必须为浮点数类型
2.1、标量
# 张量的梯度计算
import torch
x = torch.tensor(1.0,requires_grad = True)
y = x**2 +2*x +3
y.backward() # 梯度计算,(1,求y的导数;2、将标量带入导数函数求值)
# x.grad 表示求导带入值结果
print(x.grad)
import torch
# 多标量的梯度计算
x1 = torch.tensor(1., requires_grad=True)
x2 = torch.tensor(2., requires_grad=True)
y = x1**2 + 3*x2 +5
y.backward()
print(x1.grad)
print(x2.grad)
2.2、向量
损失函数接收向量后,需要进行整合称为一个元素(一半使用sum)才能进行反向传播。
反向传播后自动拆分为不同元素值的结果。
# 向量的梯度计算
import torch
x = torch.tensor([1.0,2.0,3.0],requires_grad = True)
y = x**2 +2*x +5
print(y)
y = y.sum()
print(y)
y.backward()
print(x.grad)
import torch
# 多向量的梯度计算
x1 = torch.tensor([1.,2.], requires_grad=True)
x2 = torch.tensor([2.,5.], requires_grad=True)
y = x1**2 + 3*x2 +5
y1 = y.sum()
y1.backward()
print(x1.grad)
print(x2.grad)
import torch
# 多向量的梯度计算
x1 = torch.tensor([1.,2.], requires_grad=True)
x2 = torch.tensor([2.,5.], requires_grad=True)
y = x1**2 + 3*x2 +5
y2 = y.mean()
y2.backward()
print(x1.grad)
print(x2.grad)
2.3、矩阵
# 矩阵的梯度计算
import torch
x1 = torch.tensor([[1.,2.],[3.,4.]], requires_grad=True)
y = x1**2 + 3*x1 +5
y2 = y.sum()
y2.backward()
print(x1.grad)
# 多矩阵的梯度计算
import torch
x1 = torch.tensor([[1.,2.],[3.,4.]], requires_grad=True)
x2 = torch.tensor([[11.,2.],[1.,22.]], requires_grad=True)
y = x1**2 + 3*x2 +5
y2 = y.sum()
y2.backward()
print(x1.grad)
print(x2.grad)
3、梯度控制
由于 autograd 自动计算梯度,也就是在每个损失函数操作时都会自动运行,浪费资源,所以在无需求导的损失函数时,可以进行关闭求导功能。
3.1、全局控制
创建tensor时,默认 requires_grad 等于 False;set_grad_enabled(False)
# 全局控制
import torch
x = torch.tensor(3.0,requires_grad = False)
y = x**2 +2*x +3
try:y.backward() print(x.grad)
except:print("操作报错")x = torch.tensor(3.0,requires_grad = True)
y = x**2 +2*x +3
torch.set_grad_enabled(False)
try:y.backward() print(x.grad)
except:print("操作报错")
3.2、with进行上下文管理
with torch.no_grad():在这个代码块内创建的损失函数,不会求导
# with 控制
import torch
x = torch.tensor(3.0,requires_grad = True)
with torch.no_grad():y = x**2 +2*x +3
try:y.backward() print(x.grad)
except:print("操作报错")
3.3、装饰器函数控制
将with torch.no_grad() 封装到函数,其他函数需要控制计算时候,装饰这个函数即可。
# 装饰器控制
import torchx = torch.tensor(3.0,requires_grad = True)def zsq(func):def wrapper(*args):with torch.no_grad():return func(*args)return wrapper@zsq
def fun():y = x**2 +2*x +3try:y.backward() print(x.grad)except:print("操作报错")fun() # 调用函数
4、梯度清零
在多个损失函数反向传播或重复反向传播情况下,梯度值将累计以和的形式返回结果
# 累计梯度
import torch
# 多个损失函数反向传播
x =torch.tensor(4.0,requires_grad=True)y = 2*x**2 +7 # 第一个损失函数
y.backward()
print(x.grad) # 导数结果为 16.z = x**2 # 第二个损失函数
z.backward()
print(x.grad) # 导数结果为 8. 累加就是24. 当进行梯度计算时,无法直观反应某次梯度的值,所以需要梯度清零:grad.zero_(),需要梯度存在后才可以使用清零,否则获取梯度为None,清零会报错,清零时将元素值变成0.,不会变成None
# 梯度清理
import torch
x =torch.tensor(4.0,requires_grad=True)
y = 2*x**2 +7
try:x.grad.zero_()
except:print("梯度为None,不能清零")
y.backward() # 反向传播
print(x.grad)z = x**2
z.backward()
print(x.grad)x.grad.zero_() # 梯度清理
print(x.grad is None)
print(x.grad) 5、梯度下降算法结合
import torch
w = torch.tensor(5., requires_grad=True) # 初始化 wnum =0while True: num+=1if num > 50: break# 创建损失函数loss = w**2a=0# 梯度清零if w.grad is None: pass else: a = w.grad.dataw.grad.zero_()# 方向传播loss.backward()b = w.grad.dataif (b>a and a!=0) or b ==0:break# 当前斜率print("斜率:\n",w.grad)w.data = w.data - 0.4*w.grad# 当前斜率print("更新的横坐标:\n",w.data)# 当前斜率print("----------",num) 6、叶子节点
当一个tensor设置为可以求导,那么其性质变换, 与普通tensor有区别,对数据操作时需要索引出一个只有其数据的普通tensor
叶子节点 detach() ,将tensor的数据创建为新的tensor,两者内存不一样,数据共享,这时候可以对新的tensor数据操作。
import torch
x= torch.tensor([1., 2., 3.], requires_grad=True)try:x2 = x.numpy() # 如果x是一个可以求导的张量,那么它就不能直接当作普通tensor使用print(x2)
except :print("转化错误")try:x3 = x.detach()# 取出叶子节点print(x3)print(x)x2 = x3.numpy() # 取出叶子节点后就可以转numpy了print(x2)
except :pass
相关文章:
深度学习3
五、自动微分 1、基础概念 模块 autograd 负责自动计算张量操作的梯度,具有自动求导功能;autograd 创建一个动态计算图来跟踪张量的操作,每个张量是计算图中的一个节点,节点之间的操作构成图的边。 属性 requires_grad 决定…...
Qt5.14.2的安装与环境变量及一些依赖库的配置
目录 1.Qt5.14.2安装 2.Qt环境变量及一些依赖库的配置 1.Qt5.14.2安装 QT从入门到入土(一)——Qt5.14.2安装教程和VS2019环境配置 - 唯有自己强大 - 博客园 2.Qt环境变量及一些依赖库的配置 假设QT安装目录为: D:\Qt\Qt5.14.2 将目录: D:\Qt\Qt5.14.…...
PYNQ 框架 - 时钟系统 + pl_clk 时钟输出不准确问题
目录 1. 简介 2. PS 时钟计算 2.1 计算框架 2.2 KV260 的参考时钟 2.3 PL_CLK 设置 3. 测试 3.1 Block design 3.2 引脚绑定 3.3 使用 AD2 测量 3.4 调整分频 4. PYNQ 时钟驱动 4.1 源码解析 4.2 查看 PL_CLK 4.3 配置 PL_CLK 5. 总结 1. 简介 ZYNQ MPSoC 具有…...
CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标
注:本文为 “CDAF / PDAF 原理 | PDAF、CDAF 和 LAAF 对比 | 图像清晰度评价指标” 几篇相关文章合辑。 文章中部分超链接、图片异常受引用之前的原文所限。 相机自动对焦原理 TriumphRay 于 2020-01-16 18:59:41 发布 凸透镜成像原理 这一部分大家中学应该就学过…...
类和对象--中--初始化列表(重要)、隐式类型转化(理解)、最后两个默认成员函数
1.初始化列表 1.1作用: 通过特定的值,来初始化对象。 1.2定义: 初始化列表,就相当于定义对象(开空间)。不管写不写初始化列表,每个成员变量都会走一遍初始化列表(开出对应的空间…...
uni-app运行 安卓模拟器 MuMu模拟器
最近公司开发移动端系统,使用真机时每次调试的时候换来换去的麻烦,所以使用模拟器来调试方便。记录一下安装和连接的过程 一、安装MuMu模拟器 百度搜索MuMu模拟器并打开官网或者点这里MuMu模拟器官网 点击下载模拟器 安装模拟器,如果系统…...
java 打印对象所有属性的值 循环
在Java中,如果你想要打印一个对象的所有属性值,可以使用反射(Reflection)来获取对象的所有字段,并循环遍历这些字段以打印它们的值。以下是一个示例代码,展示了如何实现这一点: 示例类 假设我…...
k8s认证、授权
在 Kubernetes 中,kubectl auth can-i 命令用于检查当前用户或指定的 ServiceAccount 是否有权限执行特定的操作: kubectl auth can-i create deployment --as system:serviceaccount:default:dev-sa这个命令的作用是检查名为 dev-sa 的 ServiceAccount…...
基于spring boot的纺织品企业财务管理系统论文
摘 要 在如今社会上,关于信息上面的处理,没有任何一个企业或者个人会忽视,如何让信息急速传递,并且归档储存查询,采用之前的纸张记录模式已经不符合当前使用要求了。所以,对纺织品企业财务信息管理的提升&…...
@RequestBody和前端的关系以及,如何在前后端之间传递数据?
RequestBody 注解在 Spring MVC 中用于将 HTTP 请求体中的数据绑定到控制器方法的参数上。为了更好地理解 RequestBody 和前端之间的关系,我们可以从以下几个方面进行探讨: 1. 请求体的格式 前端发送的请求体通常是一个 JSON 字符串,也可以…...
详解登录MySQL时出现SSL connection error: unknown error number错误
目录 登录MySQL时出错SSL connection error: unknown error number 出错原因 使用MySQL自带的工具登录MySQL 登陆之后,使用如下命令进行查看 解决方法 找到MySQL8安装目录下的my.ini配置文件 记事本打开my.ini文件,然后按下图所示添加配置 此时再…...
【大数据学习 | Spark-Core】Spark的改变分区的算子
当分区由多变少时,不需要shuffle,也就是父RDD与子RDD之间是窄依赖。 当分区由少变多时,是需要shuffle的。 但极端情况下(1000个分区变成1个分区),这时如果将shuffle设置为false,父子RDD是窄依赖关系&…...
Spring Boot Web应用开发:测试
在Spring Boot中,测试是开发过程的一个重要部分,它确保你的应用按预期工作,并且可以帮助你在早期发现和修复问题。Spring Boot提供了多种便捷的测试工具,使得编写和运行测试案例变得简单。 Spring Boot测试简介 Spring Boot支持…...
服务器数据恢复—光纤存储FC硬盘数据恢复案例
服务器存储数据恢复环境: 某品牌光纤存储上共有16块FC硬盘。存储上的卷映射到Linux操作系统上。Linux操作系统上运行Oracle数据库。 服务器存储故障&检测: 存储上2块硬盘故障灯亮起,存储映射到linux操作系统上的卷挂载不上,业…...
Android Binder技术概览
Android中的Binder是一种基于远程过程调用(Remote Procedure Call, RPC)的轻量级通信机制,核心用于 Android 系统中的进程间通信(Inter-Process Communication, IPC)。Binder 是 Android 系统中不可或缺的一部分&#…...
09 —— Webpack搭建开发环境
搭建开发环境 —— 使用webpack-dev-server 启动Web服务,自动检测代码变化,有变化后会自动重新打包,热更新到网页(代码变化后,直接替换变化的代码,自动更新网页,不用手动刷新网页) …...
深度学习模型:卷积神经网络(CNN)
一、前言 CNN 的发展历程可以追溯到 20 世纪 80 年代和 90 年代。受生物视觉系统的启发,研究人员开始探索如何构建专门用于处理图像数据的神经网络。早期的一些研究奠定了基础,例如 Fukushima 提出的 Neocognitron 模型。 随着时间的推移,到…...
Flask 自定义路由转换器
步骤 创建自定义转换器类 继承 werkzeug.routing.BaseConverter。实现 to_python 和(可选)to_url 方法。 将转换器注册到 Flask 应用 在路由中使用转换器 示例 创建转换器 假设需要自定义一个转换器 FourDigitYearConverter,用于匹配四位年…...
【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方?为什么?
博客主页: [青松] 本文专栏: NLP 大模型百面百过 【淘汰9成NLP面试者的高频面题】LSTM中的tanh和sigmoid分别用在什么地方?为什么? 重要性:★★★ 💯 本题主要考察面试者对以下问题的理解: ① 数据特征和模…...
gocv调用opencv添加中文乱码的解决方案
前言 相信很多做视觉的同学在使用opencv给图片添加中文文字的时候会出现这样的乱码显示: 而实际上你期望的是“告警时间:2011-11-11 11:11:11 告警类型:脱岗检测告警 Area:XXXXX Camera:Camera001-001”这样的显示内容,那么这篇文章我将用很简单的方法来解决乱码问题,只需…...
第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...
Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...
ssc377d修改flash分区大小
1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
条件运算符
C中的三目运算符(也称条件运算符,英文:ternary operator)是一种简洁的条件选择语句,语法如下: 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true,则整个表达式的结果为“表达式1”…...
《通信之道——从微积分到 5G》读书总结
第1章 绪 论 1.1 这是一本什么样的书 通信技术,说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号(调制) 把信息从信号中抽取出来&am…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...
