自动微分机制

Pytorch一般通过反向传播 backward 方法 实现这种求梯度计算。该方法求得的梯度将存在对应自变量张量的grad属性下。

除此之外,也能够调用torch.autograd.grad 函数来实现求梯度计算。

这就是Pytorch的自动微分机制。

一,利用backward方法求导数

backward 方法通常在一个标量张量上调用,该方法求得的梯度将存在对应自变量张量的grad属性下。
如果调用的张量非标量,则要传入一个和它同形状 的gradient参数张量。
相当于用该gradient参数张量与调用张量作向量点乘,得到的标量结果再反向传播。

1, 标量的反向传播

x = torch.tensor(0.0,requires_grad = True) # x需要被求导
#注意:这里的x是一维的
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x,2) + b*x + cy.backward()
dy_dx = x.grad
print(dy_dx)

2, 非标量的反向传播

"""
2, 非标量的反向传播
"""
import numpy as np
import torch# f(x) = a*x**2 + b*x + cx = torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad = True) # x需要被求导
#这里的x是二维的
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x,2) + b*x + cgradient = torch.tensor([[1.0,1.0],[1.0,1.0]])print("x:\n",x)
print("y:\n",y)
y.backward(gradient = gradient)
#非标量的区别在这里:相当于用该gradient参数张量与调用张量作向量点乘,得到的标量结果再反向传播。
x_grad = x.grad
print("x_grad:\n",x_grad)

3, 非标量的反向传播可以用标量的反向传播实现

"""
3, 非标量的反向传播可以用标量的反向传播实现
"""
x = torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad = True) # x需要被求导
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x,2) + b*x + cgradient = torch.tensor([[1.0,1.0],[1.0,1.0]])
z = torch.sum(y*gradient)   #将Y与权值相乘然后取和print("x:",x)
print("y:",y)
z.backward()
x_grad = x.grad
print("x_grad:\n",x_grad)

二,利用autograd.grad方法求导数

利用autograd.grad方法对单个变量求导数

"""
二,利用autograd.grad方法求导数
"""
x = torch.tensor(0.0,requires_grad = True) # x需要被求导
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x,2) + b*x + c# create_graph 设置为 True 将允许创建更高阶的导数
dy_dx = torch.autograd.grad(y,x,create_graph=True)[0]
print(dy_dx.data)# 求二阶导数
dy2_dx2 = torch.autograd.grad(dy_dx,x)[0]print(dy2_dx2.data)

利用autograd.grad方法对多个变量求导数

"""
利用autograd.grad方法对多个变量求导数
"""
x1 = torch.tensor(1.0,requires_grad = True) # x需要被求导
x2 = torch.tensor(2.0,requires_grad = True)y1 = x1*x2
y2 = x1+x2# 允许同时对多个自变量求导数
(dy1_dx1,dy1_dx2) = torch.autograd.grad(outputs=y1,inputs = [x1,x2],retain_graph = True)
print(dy1_dx1,dy1_dx2)# 如果有多个因变量,相当于把多个因变量的梯度结果求和
(dy12_dx1,dy12_dx2) = torch.autograd.grad(outputs=[y1,y2],inputs = [x1,x2])
print(dy12_dx1,dy12_dx2)

三,利用自动微分和优化器求最小值

"""
三,利用自动微分和优化器求最小值
"""x = torch.tensor(0.0,requires_grad = True) # x需要被求导
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)optimizer = torch.optim.SGD(params=[x],lr = 0.01)def f(x):result = a*torch.pow(x,2) + b*x + creturn(result)for i in range(500):optimizer.zero_grad()y = f(x)y.backward()optimizer.step()print("y=",f(x).data,";","x=",x.data)

完整代码

import torch
import numpy as np"""
1, 标量的反向传播
"""
x = torch.tensor(0.0,requires_grad = True) # x需要被求导
#注意:这里的x是一维的
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x,2) + b*x + cy.backward()
dy_dx = x.grad
print(dy_dx)"""
2, 非标量的反向传播
"""
import numpy as np
import torch# f(x) = a*x**2 + b*x + cx = torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad = True) # x需要被求导
#这里的x是二维的
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x,2) + b*x + cgradient = torch.tensor([[1.0,1.0],[1.0,1.0]])print("x:\n",x)
print("y:\n",y)
y.backward(gradient = gradient)
#非标量的区别在这里:相当于用该gradient参数张量与调用张量作向量点乘,得到的标量结果再反向传播。
x_grad = x.grad
print("x_grad:\n",x_grad)"""
3, 非标量的反向传播可以用标量的反向传播实现
"""
x = torch.tensor([[0.0,0.0],[1.0,2.0]],requires_grad = True) # x需要被求导
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x,2) + b*x + cgradient = torch.tensor([[1.0,1.0],[1.0,1.0]])
z = torch.sum(y*gradient)   #将Y与权值相乘然后取和print("x:",x)
print("y:",y)
z.backward()
x_grad = x.grad
print("x_grad:\n",x_grad)"""
二,利用autograd.grad方法求导数
"""
x = torch.tensor(0.0,requires_grad = True) # x需要被求导
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)
y = a*torch.pow(x,2) + b*x + c# create_graph 设置为 True 将允许创建更高阶的导数
dy_dx = torch.autograd.grad(y,x,create_graph=True)[0]
print(dy_dx.data)# 求二阶导数
dy2_dx2 = torch.autograd.grad(dy_dx,x)[0]print(dy2_dx2.data)
"""
利用autograd.grad方法对多个变量求导数
"""
x1 = torch.tensor(1.0,requires_grad = True) # x需要被求导
x2 = torch.tensor(2.0,requires_grad = True)y1 = x1*x2
y2 = x1+x2# 允许同时对多个自变量求导数
(dy1_dx1,dy1_dx2) = torch.autograd.grad(outputs=y1,inputs = [x1,x2],retain_graph = True)
print(dy1_dx1,dy1_dx2)# 如果有多个因变量,相当于把多个因变量的梯度结果求和
(dy12_dx1,dy12_dx2) = torch.autograd.grad(outputs=[y1,y2],inputs = [x1,x2])
print(dy12_dx1,dy12_dx2)"""
三,利用自动微分和优化器求最小值
"""x = torch.tensor(0.0,requires_grad = True) # x需要被求导
a = torch.tensor(1.0)
b = torch.tensor(-2.0)
c = torch.tensor(1.0)optimizer = torch.optim.SGD(params=[x],lr = 0.01)def f(x):result = a*torch.pow(x,2) + b*x + creturn(result)for i in range(500):optimizer.zero_grad()y = f(x)y.backward()optimizer.step()print("y=",f(x).data,";","x=",x.data)

《20天吃透Pytorch》Pytorch自动微分机制学习相关推荐

  1. 速成pytorch学习——3天自动微分机制

    神经网络通常依赖反向传播求梯度来更新网络参数,求梯度过程通常是一件非常复杂而容易出错的事情. 而深度学习框架可以帮助我们自动地完成这种求梯度运算. Pytorch一般通过反向传播 backward 方 ...

  2. pytorch autograd 自动微分与梯度更新

    自动微分 原理 pytorch 内置了常见 tensor 操作的求导解析解. 从 loss 到 parameter 是若干个 op 叠加起来的复合函数, 所以用链式法则逐个计算. tensor.gra ...

  3. 只知道TF和PyTorch还不够,快来看看怎么从PyTorch转向自动微分神器JAX

    点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:机器之心 说到当前的深度学习框架,我们往往绕不开 Ten ...

  4. 【Pytorch】用自动微分求sin(x)的导数

    目录 1. 问题分析 1.1 问题描述 1.2 解决思路 2. 代码实现 1. 问题分析 1.1 问题描述 其实这个问题很简单,本篇博客全当备忘录了.我们的需求是: 图片来源:李沐:<动手学深度 ...

  5. 20天吃透 PyTorch 中文版(附下载)

    ‍ <20天吃透PyTorch>中文版来了. PyTorch作为学生以及研究人员首选的热门框架之一,拥有易用性等优势.<20天吃透PyTorch>是一本具备简约性.通用性的小白 ...

  6. PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)

    创作不易 觉得有帮助请点赞关注收藏~~~ 一.PyTorch的Reduction操作 Reduction运算的特点是它往往对一个Tensor内的元素做归约操作,比如torch.max找极大值,torc ...

  7. Paddle中的自动微分功能测试

    简 介: 初步分析了求解梯度的部分.详细的过程可以参见以下文献: pytorch自动求梯度-详解 关键词: 自动求导,Paddle #mermaid-svg-xBXnA8Coc8mqUWW0 {fon ...

  8. 深度学习利器之自动微分(2)

    深度学习利器之自动微分(2) 文章目录 深度学习利器之自动微分(2) 0x00 摘要 0x01 前情回顾 0x02 自动微分 2.1 分解计算 2.2 计算模式 2.3 样例 2.4 前向模式(For ...

  9. 自动微分到底是什么?这里有一份自我简述

    机器之心整理 参与:思.Jamin 一直以来,自动微分都在 DL 框架背后默默地运行着,本文希望探讨它到底是什么,通过 JAX,自动微分又能怎么用. 自动微分现在已经是深度学习框架的标配,我们写的任何 ...

最新文章

  1. 数据蒋堂 | BI系统中容易被忽视的数据源功能
  2. 面试题39:二叉树的深度、判断二叉树是不是平衡
  3. pythoninput函数作用_学习python之input()函数
  4. 机器学习(二) 如何做到Kaggle排名前2%
  5. Python爬虫之Scrapy框架使用selenium
  6. 如何在1年内从产品助理到产品高管?
  7. 11、Power Query-透视列的解析
  8. asp.net跨页面传值收集
  9. CNN的卷积运算为何使用互相关而不是卷积
  10. 道路里程桩号标注_2000公里长距离电车远行,逸动EV460对里程焦虑说不
  11. python numpy.random模块中提供啦大量的随机数相关的函数
  12. PHP拦截器的使用(转)
  13. raspberry pi_如何使用Raspberry Pi构建WiFi相框
  14. 草丛三剑客之逆向生成
  15. 一步一步SharePoint 2007之四十八:实现Excel Service(3)——调用Excel Service
  16. docker export/import到docker容器迁移的思考
  17. Android背景图片设置
  18. oracle用户登录提示: user test lacks create session privilege logon denied
  19. Python包导入时重命名
  20. 产品经理的职责和分类

热门文章

  1. Java架构师教你如何突破瓶颈,持续更新中
  2. 2016面试——腾讯、蚂蚁金服、蘑菇街
  3. vSphere HA 原理与配置
  4. k8s系列--- dashboard认证及分级授权
  5. Oracle中SQL语句学习五(统计分组语句group by和having)
  6. PHP移动互联网开发笔记(3)——运算符
  7. 重构机房收费系统(一)
  8. tensorflow 安装在Anaconda
  9. C#调用WebKit内核
  10. 【笔记】一些linux实用函数技巧【原创】