PyTorch定义新的自动求导(Autograd) 函数

pytorch官网提供了定义新的求导函数的方法(链接放在文章末尾了),官网举的例子,可能我比较笨,愣是反应了好一会儿才理解。这篇博客主要讲 PyTorch求导的计算,以及定义新的自动求导函数,它怎么用。


pytorch求导时,用的是链式求导法则,例如:
y = k ∗ f u n 1 ( c ∗ x ) + b y = k* fun1(c * x) + b y=k∗fun1(c∗x)+b,其中 f u n 1 ( p ) = p 2 fun1(p) = p^{2} fun1(p)=p2 ( y y y的表达式里 p = c ∗ x p = c * x p=c∗x)
比如这个式子,我们来求一下 k , c 和 b k , c 和 b k,c和b 关于 y y y 的导数 :

  • d k = ∂ y ∂ k = f u n 1 ( c ∗ x ) = ( c x ) 2 \mathrm{d}k = \frac{\partial y}{\partial k} = fun1(c*x) = (cx)^{2} dk=∂k∂y​=fun1(c∗x)=(cx)2
  • d b = ∂ y ∂ b = 1 \mathrm{d}b = \frac{\partial y}{\partial b} = 1 db=∂b∂y​=1
  • d c = ∂ y ∂ f u n 1 ∗ ∂ f u n 1 ∂ p ∗ ∂ p ∂ c = k ∗ 2 p ∗ x = k ∗ 2 c x ∗ x \mathrm{d}c = \frac{\partial y}{\partial fun1} * \frac{\partial fun1}{\partial p} * \frac{\partial p}{\partial c} = k *2p * x = k *2cx * x dc=∂fun1∂y​∗∂p∂fun1​∗∂c∂p​=k∗2p∗x=k∗2cx∗x

假设 x = 12 , k = 0.5 , b = 0.7 , c = 0.2 x=12, k=0.5, b=0.7, c=0.2 x=12,k=0.5,b=0.7,c=0.2, 那么我们算出来的梯度

  • d k = f u n 1 ( c ∗ x ) = f u n 1 ( 2.4 ) = 5.76 dk = fun1(c*x) = fun1(2.4) = 5.76 dk=fun1(c∗x)=fun1(2.4)=5.76
  • d b = 1 db = 1 db=1
  • d c = k ∗ ( 2 ∗ ( c ∗ x ) ) ∗ x = 28.8 dc = k *(2*(c*x)) * x= 28.8 dc=k∗(2∗(c∗x))∗x=28.8

我们来验证一下

import torch
def fun1(par):out = par**2return out
x = torch.tensor([12])
k = torch.full((), 0.5, requires_grad=True) #定义可训练参数k,b,c 初始值均设为0.5,0.7和0.2
b = torch.full((), 0.7, requires_grad=True)
c = torch.full((), 0.2, requires_grad=True)
y = k*fun1(c * x) +b
y.backward()
print(k.grad)
print(b.grad)
print(c.grad)

运行结果如下:

推理正确;


那么,如果我们此时想自定义 ∂ f u n 1 ∂ p \frac{\partial fun1}{\partial p} ∂p∂fun1​
也就是自定义fun1函数的求导过程。
我们定义
∂ f u n 1 ∂ p = p \frac{\partial fun1}{\partial p} = p ∂p∂fun1​=p
那么:
d c = ∂ y ∂ f u n 1 ∗ ∂ f u n 1 ∂ p ∗ ∂ p ∂ c = k ∗ p ∗ x = k ∗ c x ∗ x = 14.4 \mathrm{d}c = \frac{\partial y}{\partial fun1} * \frac{\partial fun1}{\partial p} * \frac{\partial p}{\partial c} = k*p*x = k *cx * x = 14.4 dc=∂fun1∂y​∗∂p∂fun1​∗∂c∂p​=k∗p∗x=k∗cx∗x=14.4
验证代码如下:

import torchclass fun1(torch.autograd.Function):@staticmethoddef forward(ctx, input):ctx.save_for_backward(input)out = input**2  #定义前向传播函数fun1= input**2return out@staticmethoddef backward(ctx, grad_output):input, = ctx.saved_tensorsreturn grad_output * input #定义dfun1/dinput = inputfun = fun1.apply
x = torch.tensor([12])
k = torch.full((), 0.5, requires_grad=True) #定义可训练参数k,b,初始值均设为0.3
b = torch.full((), 0.7, requires_grad=True)
c = torch.full((), 0.2, requires_grad=True)
y = k*fun(c * x) +b
y.backward()
print(c.grad)

运行结果如下:


我们定义
∂ f u n 1 ∂ p = 1 \frac{\partial fun1}{\partial p} = 1 ∂p∂fun1​=1
那么:
d c = ∂ y ∂ f u n 1 ∗ ∂ f u n 1 ∂ p ∗ ∂ p ∂ c = k ∗ 1 ∗ x = 6 \mathrm{d}c = \frac{\partial y}{\partial fun1} * \frac{\partial fun1}{\partial p} * \frac{\partial p}{\partial c} = k *1 * x = 6 dc=∂fun1∂y​∗∂p∂fun1​∗∂c∂p​=k∗1∗x=6

验证代码如下:

import torchclass fun1(torch.autograd.Function):@staticmethoddef forward(ctx, input):ctx.save_for_backward(input)out = input**2  #定义前向传播函数fun1= input**2return out@staticmethoddef backward(ctx, grad_output):input, = ctx.saved_tensorsreturn grad_output * 1 #定义dfun1/dinput = 1fun = fun1.apply
x = torch.tensor([12])
k = torch.full((), 0.5, requires_grad=True) #定义可训练参数k,b,初始值均设为0.3
b = torch.full((), 0.7, requires_grad=True)
c = torch.full((), 0.2, requires_grad=True)
y = k*fun(c * x) +b
y.backward()
print(c.grad)

运行结果如下:

总结

总的来说,这篇博客就是解释了官方定义的求导函数是怎么求导的,给出了计算过程;解释了官方自定义求导函数,定义的是哪一部分的函数。
官方链接:PyTorch:定义新的 Autograd 函数

PyTorch定义新的自动求导(Autograd) 函数相关推荐

  1. PyTorch基础(二)-----自动求导Autograd

    一.前言 上一篇文章中提到PyTorch提供了两个重要的高级功能,分别是: 具有强大的GPU加速的张量计算(如NumPy) 包含自动求导系统的的深度神经网络 第一个特性我们会在之后的学习中用到,这里暂 ...

  2. PyTorch的计算图和自动求导机制

    文章目录 PyTorch的计算图和自动求导机制 自动求导机制简介 自动求导机制实例 梯度函数的使用 计算图构建的启用和禁用 总结 PyTorch的计算图和自动求导机制 自动求导机制简介 PyTorch ...

  3. 基于pytorch实现图像分类——理解自动求导、计算图、静态图、动态图、pytorch入门

    1. pytorch入门 什么是PYTORCH? 这是一个基于Python的科学计算软件包,针对两组受众: 替代NumPy以使用GPU的功能 提供最大灵活性和速度的深度学习研究平台 1.1 开发环境 ...

  4. tensorflow with求导_3.4tensorflow2.x自动求导原理函数详解

    自己开发了一个股票智能分析软件,功能很强大,需要的点击下面的链接获取: 1.1  tensorflow2.x自动求导 1.1.1         自动求导GradientTape类 GradientT ...

  5. PyTorch 笔记Ⅱ——PyTorch 自动求导机制

    文章目录 Autograd: 自动求导机制 张量(Tensor) 梯度 使用PyTorch计算梯度数值 Autograd 简单的自动求导 复杂的自动求导 Autograd 过程解析 扩展Autogra ...

  6. pytorch如何计算导数_Pytorch的自动求导机制与使用方法(一)

    本文以线性模型为例,讲解线性模型的求解的pytorch梯度实现方法. 要注意几个问题:在PyTorch 0.4.0版本之后,Variable类已经被禁用了,所有的torch.Tensor与torch. ...

  7. PyTorch 1.0 中文官方教程:Autograd:自动求导

    译者:bat67 最新版会在译者仓库首先同步. PyTorch中,所有神经网络的核心是autograd包.先简单介绍一下这个包,然后训练我们的第一个的神经网络. autograd包为张量上的所有操作提 ...

  8. Pytorch Autograd (自动求导机制)

    Introduce Pytorch Autograd库 (自动求导机制) 是训练神经网络时,反向误差传播(BP)算法的核心. 本文通过logistic回归模型来介绍Pytorch的自动求导机制.首先, ...

  9. 【PyTorch基础教程2】自动求导机制(学不会来打我啊)

    文章目录 第一部分:深度学习和机器学习 一.机器学习任务 二.ML和DL区别 (1)数据加载 (2)模型实现 (3)训练过程 第二部分:Pytorch部分 一.学习资源 二.自动求导机制 2.1 to ...

最新文章

  1. python爬取哔哩哔哩视频_荐爬取哔哩哔哩中的cosplay小视频
  2. git push 不再需要重复输入账户密码的技巧
  3. Redis集群的重启
  4. 利用Cydia Substrate进行Android HOOK (1)
  5. oracle如何避免表锁定,Oracle 解决表锁定的问题
  6. 如何设置Pycharm在打开Terminal终端时,自动进入虚拟环境?
  7. NOIP1996复赛 普及组 第二题 python
  8. [Tyvj模拟赛]运
  9. 思维导图github地址
  10. 基于springboot人事管理系统设计与实现
  11. Eclipse配置SVN教程
  12. 北大飞跃手册_活动推介|2020年吉林大学飞跃手册预发布会即将召开!
  13. 计算机指数函数符号,数学公式及符号大全
  14. Layabox 2 使用其它编辑器开发layabox2d
  15. 梦开始的地方——VS2019调试技巧
  16. Windows 2003安装和配置活动目录服务
  17. lftp命令使用 操作系统(Windows、Linux) PHP学会网 php培训网 PHP暑期培训 PHP寒假培训 PHP假期培训 - powered by phpwhy.com
  18. android一键添加QQ群,关注微信公众号
  19. linux usb 批量传输文件,一种Linux系统下提升usb批量传输速度的方法及系统与流程...
  20. css3中斜杠_使用斜杠语法设置CSS3边界半径

热门文章

  1. (干货)Adobe软件分享
  2. 基于工程热物理的燃料电池(Thermolib)和整车模型集成系统级仿真探讨
  3. mysql 把时间戳转时间格式_mysql时间戳转成常用可读时间格式的两种方法
  4. Proxyee-down的下载与安装教程
  5. sql面试笔试题大全
  6. 基于C++的车辆装甲板检测自瞄系统
  7. vistar居然把迅雷给"蹂躏"了
  8. 2022年R2移动式压力容器充装考试模拟100题及答案
  9. H5网页播放器EasyPlayer.js也能做直播视频实时录像了
  10. 安装64位的WIN7有感