《20天吃透Pytorch》Pytorch自动微分机制学习
自动微分机制
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自动微分机制学习相关推荐
- 速成pytorch学习——3天自动微分机制
神经网络通常依赖反向传播求梯度来更新网络参数,求梯度过程通常是一件非常复杂而容易出错的事情. 而深度学习框架可以帮助我们自动地完成这种求梯度运算. Pytorch一般通过反向传播 backward 方 ...
- pytorch autograd 自动微分与梯度更新
自动微分 原理 pytorch 内置了常见 tensor 操作的求导解析解. 从 loss 到 parameter 是若干个 op 叠加起来的复合函数, 所以用链式法则逐个计算. tensor.gra ...
- 只知道TF和PyTorch还不够,快来看看怎么从PyTorch转向自动微分神器JAX
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转载自:机器之心 说到当前的深度学习框架,我们往往绕不开 Ten ...
- 【Pytorch】用自动微分求sin(x)的导数
目录 1. 问题分析 1.1 问题描述 1.2 解决思路 2. 代码实现 1. 问题分析 1.1 问题描述 其实这个问题很简单,本篇博客全当备忘录了.我们的需求是: 图片来源:李沐:<动手学深度 ...
- 20天吃透 PyTorch 中文版(附下载)
<20天吃透PyTorch>中文版来了. PyTorch作为学生以及研究人员首选的热门框架之一,拥有易用性等优势.<20天吃透PyTorch>是一本具备简约性.通用性的小白 ...
- PyTorch深度学习基础之Reduction归约和自动微分操作讲解及实战(附源码 超详细必看)
创作不易 觉得有帮助请点赞关注收藏~~~ 一.PyTorch的Reduction操作 Reduction运算的特点是它往往对一个Tensor内的元素做归约操作,比如torch.max找极大值,torc ...
- Paddle中的自动微分功能测试
简 介: 初步分析了求解梯度的部分.详细的过程可以参见以下文献: pytorch自动求梯度-详解 关键词: 自动求导,Paddle #mermaid-svg-xBXnA8Coc8mqUWW0 {fon ...
- 深度学习利器之自动微分(2)
深度学习利器之自动微分(2) 文章目录 深度学习利器之自动微分(2) 0x00 摘要 0x01 前情回顾 0x02 自动微分 2.1 分解计算 2.2 计算模式 2.3 样例 2.4 前向模式(For ...
- 自动微分到底是什么?这里有一份自我简述
机器之心整理 参与:思.Jamin 一直以来,自动微分都在 DL 框架背后默默地运行着,本文希望探讨它到底是什么,通过 JAX,自动微分又能怎么用. 自动微分现在已经是深度学习框架的标配,我们写的任何 ...
最新文章
- 数据蒋堂 | BI系统中容易被忽视的数据源功能
- 面试题39:二叉树的深度、判断二叉树是不是平衡
- pythoninput函数作用_学习python之input()函数
- 机器学习(二) 如何做到Kaggle排名前2%
- Python爬虫之Scrapy框架使用selenium
- 如何在1年内从产品助理到产品高管?
- 11、Power Query-透视列的解析
- asp.net跨页面传值收集
- CNN的卷积运算为何使用互相关而不是卷积
- 道路里程桩号标注_2000公里长距离电车远行,逸动EV460对里程焦虑说不
- python numpy.random模块中提供啦大量的随机数相关的函数
- PHP拦截器的使用(转)
- raspberry pi_如何使用Raspberry Pi构建WiFi相框
- 草丛三剑客之逆向生成
- 一步一步SharePoint 2007之四十八:实现Excel Service(3)——调用Excel Service
- docker export/import到docker容器迁移的思考
- Android背景图片设置
- oracle用户登录提示: user test lacks create session privilege logon denied
- Python包导入时重命名
- 产品经理的职责和分类