python中几种自动微分库解析


Posted in Python onAugust 29, 2019

前言

简单介绍下python的几个自动求导工具,tangent、autograd、sympy;

在各种机器学习、深度学习框架中都包含了自动微分,微分主要有这么四种:手动微分法、数值微分法、符号微分法、自动微分法,这里分别简单走马观花(hello world式)的介绍下下面几种微分框架;

sympy 强大的科学计算库,使用的是符号微分,通过生成符号表达式进行求导;求得的导数不一定为最简的,当函数较为复杂时所生成的表达式树异常复杂;

autograd自动微分先将符号微分用于基本的算子,带入数值并保存中间结果,后应用于整个函数;自动微分本质上就是图计算,容易做很多优化所以广泛应用于各种机器学习深度学习框架中;

tangent 为源到源(source-to-source)的自动微分框架,在计算函数f微分时他通过生成新函数f_grad来计算该函数的微分,与目前所存在的所有自动微分框架都有所不同;由于它是通过生成全新的函数来计算微分所以具有非常搞的可读性、可调式性这也是官方所说的与当前自动微分框架的重大不同;

sympy 求导

def grad():
   # 定义表达式的变量名称
   x, y = symbols('x y')
   # 定义表达式
   z = x**2 +y**2
   # 计算z关于y对应的偏导数
   return diff(z, y)
 func = grad()

输出结果表达式z的导函数z‘=2*y

print(func)

把y 等于6 带入计算 结果 为12

print(func.evalf(subs ={'y':3}))

Autograd求偏导

import autograd.numpy as np
 from autograd import grad
 #表达式 f(x,y)=x^2+3xy+y^2
 #df/dx = 2x+3y
 #df/dy = 3x+2y
 #x=1,y=2
 #df/dx=8
 #df/dy=7
 def fun(x, y):
  z=x**2+3*x*y+y**2
  return z
 fun_grad = grad(fun)
 fun_grad(2.,1.)

输出:7.0

tangent求导

import tangent
 def fun(x, y):
  z=x**2+3*x*y+y**2
  return z

默认为求z关于x的偏导数

dy_dx = tangent.grad(fun)

输出偏导数值为 8 ,z' = 2 * x,此处x传任何值都是一样的

df(4, y=1)

可通过使用wrt参数指定求关于某个参数的偏导数,下面为求z关于y的偏导数

df = tangent.grad(funs, wrt=([1]))

输出值为10 ,z' = 2 *y,此处x传任何值都是一样的

df(x=0, y=5)

上面说了那么多也没体现出tangent的核心:源到源(source-to-source)

在生成导函数的时候加入verbose=1参数,即可看到tangent为我们生成的用于计算导数的函数,默认情况下该值为0所以我们没感觉到tangent的求导与别的自动微分框架有什么区别;

def df(x):
   z = x**2
   return z
 df = tangent.grad(df, verbose=1)
 df(x=2)

在执行完上述代码后,我们看到了tangent为我们所生成用于求导数的函数:

def ddfdx(x, bz=1.0):
  z = x ** 2
  assert tangent.shapes_match(z, bz), 'Shape mismatch between return value (%s) and seed derivative (%s)' % (numpy.shape(z), numpy.shape(bz))
 # Grad of: z = x ** 2
 _bx = 2 * x * bz
 bx = _bx
 return bx

ddfdx函数就是所生成的函数,从中我们也可以看到表达式z的导函数z'=2 * x,tangent就是通过执行该函数用于求得导数的;

sympy 中的自动微分只是它强大的功能之一,autograd 从名字也可知它就是为了自动微分而生的,tangent初出茅庐2017年底Google才发布的自动微分方法也比较新颖,从17年发v0.1.8版本后也没见发版,源码更新也不够活跃;sympy、autograd比较成熟,tangent还有待观察;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python实现的tab文件操作类分享
Nov 20 Python
python实现中文输出的两种方法
May 09 Python
利用python爬取散文网的文章实例教程
Jun 18 Python
Python队列的定义与使用方法示例
Jun 24 Python
TensorFlow实现卷积神经网络CNN
Mar 09 Python
Python Json模块中dumps、loads、dump、load函数介绍
May 15 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
Django打印出在数据库中执行的语句问题
Jul 25 Python
python return逻辑判断表达式实现解析
Dec 02 Python
centos7中安装python3.6.4的教程
Dec 11 Python
pytorch实现特殊的Module--Sqeuential三种写法
Jan 15 Python
PyTorch中torch.tensor与torch.Tensor的区别详解
May 18 Python
详解python中index()、find()方法
Aug 29 #Python
python同步两个文件夹下的内容
Aug 29 #Python
Python中 CSV格式清洗与转换的实例代码
Aug 29 #Python
详解如何在cmd命令窗口中搭建简单的python开发环境
Aug 29 #Python
python rsync服务器之间文件夹同步脚本
Aug 29 #Python
python-tornado的接口用swagger进行包装的实例
Aug 29 #Python
Python csv模块使用方法代码实例
Aug 29 #Python
You might like
深入PHP与浏览器缓存的分析
2013/06/03 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
php序列化函数serialize() 和 unserialize() 与原生函数对比
2015/05/08 PHP
thinkphp jquery实现图片上传和预览效果
2020/07/22 PHP
基于php实现的验证码小程序
2016/12/13 PHP
PHP扩展安装方法步骤解析
2020/11/24 PHP
硬盘浏览程序,保存成网页格式便可使用
2006/12/03 Javascript
JQuery跨Iframe选择实现代码
2010/08/19 Javascript
理清apply(),call()的区别和关系
2011/08/14 Javascript
js+html+css实现鼠标移动div实例
2013/01/30 Javascript
js同比例缩放图片的小例子
2013/10/30 Javascript
JavaScrip实现PHP print_r的数功能(三种方法)
2013/11/12 Javascript
JS获取网页属性包括宽、高等等
2014/04/03 Javascript
javascript委托(Delegate)blur和focus用法实例分析
2015/05/26 Javascript
轻量级网页遮罩层jQuery插件用法实例
2015/07/31 Javascript
jQuery学习笔记之回调函数
2016/08/15 Javascript
web3.js增加eth.getRawTransactionByHash(txhash)方法步骤
2018/03/15 Javascript
解决ng-repeat产生的ng-model中取不到值的问题
2018/10/02 Javascript
Vue数字输入框组件使用方法详解
2020/02/10 Javascript
用Python进行行为驱动开发的入门教程
2015/04/23 Python
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
Python数据类型详解(二)列表
2016/05/08 Python
python开发利器之ulipad的使用实践
2017/03/16 Python
Python创建xml文件示例
2017/03/22 Python
python 把文件中的每一行以数组的元素放入数组中的方法
2018/04/29 Python
Python中pillow知识点学习
2018/04/30 Python
python 获取键盘输入,同时有超时的功能示例
2018/11/13 Python
如何更改 pandas dataframe 中两列的位置
2019/12/27 Python
Python实现遗传算法(二进制编码)求函数最优值方式
2020/02/11 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
Priority Pass机场贵宾室会籍计划:全球超过1200间机场贵宾室
2018/08/26 全球购物
英国健身超市:Fitness Superstore
2019/06/17 全球购物
音乐学个人的自荐书范文
2013/11/26 职场文书
毕业生个人总结
2015/02/28 职场文书
2015民办小学年度工作总结
2015/05/26 职场文书
2016秋季校长开学典礼致辞
2015/11/26 职场文书