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

pytorch基本运算-Python控制流梯度运算

【1】引言

前序学习进程中,已经对pytorch基本运算-梯度运算:requires_grad_(True)和backward()进行了学习,了解了pytorch求导的基本运算方法。
今天继续学习,当计算进入循环时,就进入了Python控制流,如何对Python控制流进行梯度运算就是学习目标。

【2】Python控制流循环运算对应梯度

这里我们使用一个代码实例来体会梯度运算。
首先引入模块:

# 引入模块
import torch

这里的目的是引入Pytorch模块,为之后的运算构建一个Pytorch环境。
然后定义一个常数:

# 定义变量a为标准正态分布的随机数,并且允许对a求导
a=torch.randn(size=(),requires_grad=True)

这个常数会代入后面的运算,这个运算先定义了一个函数:

# 定义基本函数
def f(a):b=a*2print('a0=',a)print('b0=', b)k=1# 如果b的绝对值小于1000,b的值扩大2倍# 这个扩大2倍的计算循环执行,直到b的绝对值超过1000while b.norm()<20:b=b*2k=k+1print('b[',k,']=',b)print('k=',k)# 如果b本身的值非负,c的取值就是b# 否则c的取值是100*b# 返回c值if b.sum()>0:c=belse:c=100*bprint('c=',c)return c

这个自定义函数首先定义了一个b=a2,然后判断b的绝对值是否小于1000,如果满足,就不断扩大两倍,直到b的绝对值大于1000。
之后根据b的实际取值,对c进行赋值,如果b是正数,c=b,否则c=100
b。
之后就很简单,直接提取循环计算的计算结果就可以:

d=f(a)
# 对自定义函数的返回值求导
d.backward()
# 输出a的导数
print('a.grad=',a.grad)
# 输出d
print('d=',d)
# 输出d/a的结果
print('d/a=',d/a)
# 输出a.grad和d/a是否相等
print('a.grad==d/a=',a.grad==d/a)

这里面对循环求导数实际上定义完a.grad就够了,单位了展示细节,分别输出了a,d/a。
代码运行后,输出的实际效果为:

a= tensor(0.9862, requires_grad=True)
a0= tensor(0.9862, requires_grad=True)
b0= tensor(1.9725, grad_fn=)
b[ 2 ]= tensor(3.9450, grad_fn=)
k= 2
b[ 3 ]= tensor(7.8899, grad_fn=)
k= 3
b[ 4 ]= tensor(15.7799, grad_fn=)
k= 4
b[ 5 ]= tensor(31.5597, grad_fn=)
k= 5
c= tensor(31.5597, grad_fn=)
a.grad= tensor(32.)
d= tensor(31.5597, grad_fn=)
d/a= tensor(32., grad_fn=)
a.grad==d/a= tensor(True)

这里的最开始获得随机数a=0.9862,然后它扩大2倍赋值给b,b<1000,所以会继续不断按照2倍的速率扩大,直到b>1000,刚好计算了5次,也就是k的取值。
由于b>0,所以c的取值就是b,因为b相对a扩大了5次,所以循环计算对a的导数就是2^5=32。这个值就是d/a的结果。
如果再计算一次,a的取值为负:

a= tensor(-2.3740, requires_grad=True)
a0= tensor(-2.3740, requires_grad=True)
b0= tensor(-4.7480, grad_fn=)
b[ 2 ]= tensor(-9.4960, grad_fn=)
k= 2
b[ 3 ]= tensor(-18.9921, grad_fn=)
k= 3
b[ 4 ]= tensor(-37.9842, grad_fn=)
k= 4
c= tensor(-3798.4180, grad_fn=)
a.grad= tensor(1600.)
d= tensor(-3798.4180, grad_fn=)
d/a= tensor(1600., grad_fn=)
a.grad==d/a= tensor(True)

此时b会在往负数不断变小的方向上,按照2倍的速率扩大绝对值,一共计算了4次。
由于b<0,所以c的取值就是b*100,因为b相对a扩大45次,所以循环计算对a的导数就是(2^4)*100=1600。这个值就是d/a的结果。

此时的完整代码为:

# 引入模块
import torch# 定义基本函数
def f(a):b=a*2print('a0=',a)print('b0=', b)k=1# 如果b的绝对值小于1000,b的值扩大2倍# 这个扩大2倍的计算循环执行,直到b的绝对值超过1000while b.norm()<20:b=b*2k=k+1print('b[',k,']=',b)print('k=',k)# 如果b本身的值非负,c的取值就是b# 否则c的取值是100*b# 返回c值if b.sum()>0:c=belse:c=100*bprint('c=',c)return c
# 定义变量a为标准正态分布的随机数,并且允许对a求导
a=torch.randn(size=(),requires_grad=True)
# 输出a
print('a=',a)
# 将a代入自定义函数
d=f(a)
# 对自定义函数的返回值求导
d.backward()
# 输出a的导数
print('a.grad=',a.grad)
# 输出d
print('d=',d)
# 输出d/a的结果
print('d/a=',d/a)
# 输出a.grad和d/a是否相等
print('a.grad==d/a=',a.grad==d/a)

【3】总结

学习了以循环为基础的Python控制流梯度运算的基本方法。


文章转载自:

http://7JIcavJ3.rtryr.cn
http://ETjd1NhZ.rtryr.cn
http://VnjOtR0P.rtryr.cn
http://QhFNhVgu.rtryr.cn
http://8uRG3Aww.rtryr.cn
http://eVsuBcJ9.rtryr.cn
http://cnstlcMQ.rtryr.cn
http://wm37b02g.rtryr.cn
http://Y5WCIMXB.rtryr.cn
http://v0ODj8Pl.rtryr.cn
http://MtyyWBmk.rtryr.cn
http://CmTghCaa.rtryr.cn
http://j8g8HbBt.rtryr.cn
http://WdQzzVcJ.rtryr.cn
http://Sxa3nzhk.rtryr.cn
http://AskkxtLN.rtryr.cn
http://HpZWy06h.rtryr.cn
http://HrmBF6Wj.rtryr.cn
http://iuviS4mJ.rtryr.cn
http://cEllw9dK.rtryr.cn
http://YCrSxWSN.rtryr.cn
http://DbxFNqZj.rtryr.cn
http://qhtbO1IG.rtryr.cn
http://vDhB2R3r.rtryr.cn
http://xKVufncL.rtryr.cn
http://sLqHdoMY.rtryr.cn
http://VdfkEIiH.rtryr.cn
http://SKe4K5jJ.rtryr.cn
http://rWdqkPvk.rtryr.cn
http://ePyqaFwa.rtryr.cn
http://www.dtcms.com/a/381593.html

相关文章:

  • 编程与数学 03-005 计算机图形学 17_虚拟现实与增强现实技术
  • 计算机网络(一)基础概念
  • [Windows] 搜索文本2.6.2(从word、wps、excel、pdf和txt文件中查找文本的工具)
  • 【iOS】设计模式复习
  • RNN,GRU和LSTM的简单实现
  • 无人机如何实现图传:从原理到实战的全景解读
  • 多旋翼无人机开发方案
  • 基于MATLAB的无人机三维路径规划与避障算法实现
  • Web基础学习笔记02
  • Spring Boot 项目启动报错:MongoSocketOpenException 连接被拒绝排查日记
  • OpenCV(cv2)学习笔记:从模板匹配入门到常用函数
  • FFmpeg合成mp4
  • 解决 ubuntu 重启串口号变化
  • 《算法与数据结构》第六章[第3节]:二叉树(第二部分)
  • 深入理解 Python 中的 `__call__` 方法
  • AI 智能体的定义与演进
  • 鸿蒙Next ArkWeb网页交互管理:从基础到高级实战
  • 给CentOS的虚拟机扩容
  • Redis 持久化:RDB 和 AOF 的 “爱恨情仇”
  • 多源最短路(Floyd算法
  • 【数据结构——图(例图篇)】
  • 安卓俄罗斯方块,经典拖动双模式体验
  • 21th cpp think
  • 收集飞花令碎片——C语言关键字typedef
  • Python/JS/Go/Java同步学习(第十二篇)四语言“字符串填充编号“对照表: 财务“小南“纸式填充术加凭证编号崩溃(附源码/截图/参数表/避坑指南)
  • 工具变量-5G试点城市DID数据(2014-2025年
  • 金融数学专业需要学哪些数学和编程内容?
  • 【算法】【链表】148.排序链表--通俗讲解
  • Linux 内核镜像与启动组件全解析:从 vmlinux 到 extlinux.conf
  • HIS架构智能化升级编程路径:从底层原理到临床实践的深度解析(上)