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 sys模块sys.path使用方法示例
Dec 04 Python
PyQt5实现下载进度条效果
Apr 19 Python
python3中获取文件当前绝对路径的两种方法
Apr 26 Python
python版本五子棋的实现代码
Dec 11 Python
使用python socket分发大文件的实现方法
Jul 08 Python
Pytorch卷积层手动初始化权值的实例
Aug 17 Python
关于python3中setup.py小概念解析
Aug 22 Python
为什么说python更适合树莓派编程
Jul 20 Python
Python 如何定义匿名或内联函数
Aug 01 Python
python ssh 执行shell命令的示例
Sep 29 Python
Python 随机按键模拟2小时
Dec 30 Python
python实现ROA算子边缘检测算法
Apr 05 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中的观察者模式简单实例
2015/01/20 PHP
PHP解密支付宝小程序的加密数据、手机号的示例代码
2021/02/26 PHP
JQuery Ajax通过Handler访问外部XML数据的代码
2010/06/01 Javascript
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
asp.net刷新本页面的六种方法总结
2014/01/07 Javascript
JavaScript strike方法入门实例(给字符串加上删除线)
2014/10/17 Javascript
简单分析javascript面向对象与原型
2015/05/21 Javascript
JavaScript数据库TaffyDB用法实例分析
2015/07/27 Javascript
jQuery弹出窗口打开链接的实现代码
2016/12/24 Javascript
Angular中$state.go页面跳转并传递参数的方法
2017/05/09 Javascript
微信小程序本地缓存数据增删改查实例详解
2017/05/24 Javascript
js判断输入框不能为空格或null值的实现方法
2018/03/02 Javascript
vue之将echart封装为组件
2018/06/02 Javascript
微信小程序自定义组件实现tabs选项卡功能
2018/07/14 Javascript
vue如何根据网站路由判断页面主题色详解
2018/11/02 Javascript
从0到1搭建Element的后台框架的方法步骤
2019/04/10 Javascript
记一次用vue做的活动页的方法步骤
2019/04/11 Javascript
基于JS抓取某高校附近共享单车位置 使用web方式展示位置变化代码实例
2019/08/27 Javascript
基于Node的Axure文件在线预览的实现代码
2019/08/28 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
vue3使用vue-count-to组件的实现
2020/12/25 Vue.js
Python获取网页上图片下载地址的方法
2015/03/11 Python
Flask入门教程实例:搭建一个静态博客
2015/03/27 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
python之信息加密题目详解
2019/06/26 Python
pandas实现excel中的数据透视表和Vlookup函数功能代码
2020/02/14 Python
基于Keras中Conv1D和Conv2D的区别说明
2020/06/19 Python
HTML5中语义化 b 和 i 标签
2008/10/17 HTML / CSS
html5实现完美兼容各大浏览器的播放器
2014/12/26 HTML / CSS
业务经理的岗位职责
2013/11/16 职场文书
贷款担保申请书
2014/05/20 职场文书
HTML中的表单Form实现居中效果
2021/05/25 HTML / CSS
详解Python requests模块
2021/06/21 Python
如何利用Python实现n*n螺旋矩阵
2022/01/18 Python
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js
Python使用永中文档转换服务
2022/05/06 Python