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 相关文章推荐
在Django框架中编写Contact表单的教程
Jul 17 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 Python
Python算法应用实战之栈详解
Feb 04 Python
python实现批量图片格式转换
Jun 16 Python
Python3实现发送邮件和发送短信验证码功能
Jan 07 Python
pycharm设置当前工作目录的操作(working directory)
Feb 14 Python
将labelme格式数据转化为标准的coco数据集格式方式
Feb 17 Python
基于Python实现简单学生管理系统
Jul 24 Python
Python爬虫防封ip的一些技巧
Aug 06 Python
Vs Code中8个好用的python 扩展插件
Oct 12 Python
python 用opencv实现霍夫线变换
Nov 27 Python
如何利用python实现Simhash算法
Jun 28 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中的 == 运算符进行字符串比较
2006/11/26 PHP
如何使用FireFox插件FirePHP调试PHP
2013/07/23 PHP
php判断是否为json格式的方法
2014/03/04 PHP
关于php中一些字符串总结
2016/05/05 PHP
php写一个函数,实现扫描并打印出自定目录下(含子目录)所有jpg文件名
2017/05/26 PHP
PHP实现限制域名访问的实现代码(本地验证)
2020/09/13 PHP
JQUERY获取form表单值的代码
2010/07/17 Javascript
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
JavaScript的漂亮的代码片段
2013/06/05 Javascript
js获得当前时区夏令时发生和终止的时间代码
2014/02/23 Javascript
JavaScript实现仿网易通行证表单验证
2015/05/25 Javascript
JavaScript实现带缓冲效果的随屏滚动漂浮广告代码
2015/11/06 Javascript
详解AngularJS中自定义过滤器
2015/12/28 Javascript
jQuery实现拖拽页面元素并将其保存到cookie的方法
2016/06/12 Javascript
jquery 判断div show的状态实例
2016/12/03 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
vue组件入门知识全梳理
2020/09/21 Javascript
在CentOS上配置Nginx+Gunicorn+Python+Flask环境的教程
2016/06/07 Python
Python2与python3中 for 循环语句基础与实例分析
2017/11/20 Python
python编程实现12306的一个小爬虫实例
2017/12/27 Python
python 统计一个列表当中的每一个元素出现了多少次的方法
2018/11/14 Python
Python实现去除列表中重复元素的方法总结【7种方法】
2019/02/16 Python
Python生成器的使用方法和示例代码
2019/03/04 Python
Python3基础教程之递归函数简单示例
2019/06/07 Python
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
Canvas绘制浮动球效果的示例
2017/12/29 HTML / CSS
亚马逊加拿大网站:Amazon.ca
2020/01/06 全球购物
十岁生日父母答谢词
2014/01/18 职场文书
服装行业创业计划书范文
2014/02/05 职场文书
《灰椋鸟》教学反思
2014/04/27 职场文书
法律系毕业生求职信
2014/05/28 职场文书
机关作风建设心得体会
2014/10/22 职场文书
2015年乡镇人大工作总结
2015/04/22 职场文书
在校生证明
2015/06/17 职场文书
运动会广播稿200字
2015/08/19 职场文书
python 提取html文本的方法
2021/05/20 Python