torch.tensor是包的核心类,若将其属性.requires_grad设置为True,则会开始跟踪tensor的所有操作,完成计算后,可以调用.backward()来自动计算所有梯度。该张量的梯度将累积到.grad属性中。

如果需要停止tensor历史记录的跟踪,可以调用.detach(),它将其余计算历史记录分离,并防止将来的计算被跟踪。要停止跟踪历史记录(和使用内存),可以将代码块使用with torch.no_grad()包装起来,在评估模型时,这特别有用,因为模型在训练阶段具有requires_grad=True的可训练参数有利于调参,而在评估阶段不需要梯度。还有一个类对于autograd实现非常重要那就是Function。Tensor和Function互相连接并构建一个非循环图,它保存整个完整的计算过程的历史信息。每个张量都有一个.grad_fn属性保存着创建了张量的Function的引用,(如果用户自己创建张量,则g_rad_fn是None)。如果想计算导数,可以调用Tensor.backward(),如果Tensor是标量(即它包含一个元素数据),则不需要指定任何参数backward(),但是如果他有更多元素,则需要指定一个gradient参数来指定张量的形状。


#!/usr/bin/env torch
# -*- coding:utf-8 -*-
# @Time  : 2021/1/30, 14:37
# @Author: Lee
# @File  : auto_grad.pyimport torch# 创建一个张量,设置requires_grad=True来跟踪它相关的计算
x = torch.ones(2, 2, requires_grad=True)
print("x = ", x)
"""
x =  tensor([[1., 1.], [1., 1.]], requires_grad=True)
"""# 对该张量做一个操作
y = x + 2
print("y = ", y)
print(y.grad_fn)  # y作为操作的结果被创建,所以它有grad_fn
"""
y =  tensor([[3., 3.],[3., 3.]], grad_fn=<AddBackward0>)
<AddBackward0 object at 0x0000026B0564D220>
"""# 针对y做更多的操作
z = y * y * 3
out = z.mean()
print("z = ", z, "\nout = ", out)
"""
z =  tensor([[27., 27.],[27., 27.]], grad_fn=<MulBackward0>)
out =  tensor(27., grad_fn=<MeanBackward0>)
"""# .requires_grad_(...)会改变张量的requires_grad标记,输入的标记默认为False,
# 如果没有提供相应的参数
a = torch.randn(2, 2)
a = ((a * 3) / (a - 1))
print("a.requires_grad = ", a.requires_grad)
"""
a.requires_grad =  False
"""
a.requires_grad_(True)
print("after True, a.requires_grad = ", a.requires_grad)
"""
after True, a.requires_grad =  True
"""
b = (a * a).sum()
print("b.grad_fn = ", b.grad_fn)
"""
b.grad_fn =  <SumBackward0 object at 0x000001FFFB8AE310>
"""# 现在向后传播,因为输出包含了一个标量,out.backward()等同于out.backward(torch.tensor(1.))
out.backward()
print("x.grad = ", x.grad)  # 打印梯度d(out)/dx
"""
x.grad =  tensor([[4.5000, 4.5000],[4.5000, 4.5000]])
"""# 雅克比向量积
x = torch.randn(3, requires_grad=True)
y = x * 2
while y.data.norm() < 1000:y = y * 2
print("y = ", y)
"""
y =  tensor([ 105.4538, -508.8583, 1537.1407], grad_fn=<MulBackward0>)
"""# 现在在这种情况下,y不再是一个标量。torch.autograd不能够直接计算整个雅克比,但是如果我们
# 只想要雅克比向量积,只需要简单的传递向量给backward作为参数
v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float)
y.backward(v)
print("x.grad = ", x.grad)
"""
x.grad =  tensor([1.0240e+02, 1.0240e+03, 1.0240e-01])
"""# 可以将代码包裹在with torch.no_grad(),来停止对从跟中历史中的.requires_grad=True的张量自动求导
print(" x.requires_grad = ", x.requires_grad)
print("(x ** 2).requires_grad = ", (x ** 2).requires_grad)
with torch.no_grad():print("(x ** 2).requires_grad = ", (x ** 2).requires_grad)
"""
x.requires_grad = True
(x ** 2).requires_grad = True
(x ** 2).requires_grad = False
"""

以上代码中,需要明白out.backward(),对x求导的结果x.grad =  tensor([[4.5000, 4.5000],  [4.5000, 4.5000]])是如何得到的。根据代码中的计算过程可知:


在数学上,如果有,那么对于的导数是一个雅克比矩阵:

总的来说,torch.autograd是一个对于雅克比矩阵向量积的计算工具。对于任一向量,计算向量积,如果恰好是一个标量函数,也就是说,,再由链式法则,这个雅克比向量向量积可以被表示成关于的梯度:

Pytorch基础(二) 初始自动微分相关推荐

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

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

  2. PyTorch随笔 - Automatic Differentiation 自动微分

    面试题: 函数:f(1) = x, f(n+1) = 4*f(n)*(1-f(n)) 实现f(4)的函数,当x=2时,f(4)的值是多少,导数(微分)值是多少? 即: def func(x, k):. ...

  3. 如何在python中表示微分_Python实现自动微分(Automatic Differentiation)

    什么是自动微分 自动微分(Automatic Differentiation)是什么?微分是函数在某一处的导数值,自动微分就是使用计算机程序自动求解函数在某一处的导数值.自动微分可用于计算神经网络反向 ...

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

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

  5. pytorch基础-使用 TORCH.AUTOGRAD 进行自动微分(5)

    在训练神经网络时,最常用的算法是反向传播.PyTorch的反向传播(即tensor.backward())是通过autograd包来实现的,autograd包会根据tensor进行过的数学运算来自动计 ...

  6. python学习框架图-从零搭建深度学习框架(二)用Python实现计算图和自动微分

    我们在上一篇文章<从零搭建深度学习框架(一)用NumPy实现GAN>中用Python+NumPy实现了一个简单的GAN模型,并大致设想了一下深度学习框架需要实现的主要功能.其中,不确定性最 ...

  7. 一文详解pytorch的“动态图”与“自动微分”技术

    前言 众所周知,Pytorch是一个非常流行且深受好评的深度学习训练框架.这与它的两大特性"动态图"."自动微分"有非常大的关系."动态图" ...

  8. 《20天吃透Pytorch》Pytorch自动微分机制学习

    自动微分机制 Pytorch一般通过反向传播 backward 方法 实现这种求梯度计算.该方法求得的梯度将存在对应自变量张量的grad属性下. 除此之外,也能够调用torch.autograd.gr ...

  9. 【PyTorch基础教程2】自动求导机制(学不会来打我啊)

    文章目录 第一部分:深度学习和机器学习 一.机器学习任务 二.ML和DL区别 (1)数据加载 (2)模型实现 (3)训练过程 第二部分:Pytorch部分 一.学习资源 二.自动求导机制 2.1 to ...

最新文章

  1. 终端bash美化(FC)
  2. 第二章 单元测试的基本概念和核心技法
  3. linux 命令篇 -- 新建用户
  4. python中对数组合并的方法
  5. leetcode474. 一和零(动态规划)
  6. GridView结合Dropdownlist和Checkbox
  7. 《编程珠玑》——读书笔记1
  8. timestamp显示毫秒_TimeStamp 毫秒和纳秒
  9. oracle 建立临时表语句,oracle创建临时表
  10. C语言用广播星历求卫星坐标,GPS广播星历计算卫星位置和速度-Read
  11. 虚拟机打不开磁盘或它所依赖的某个快照磁盘
  12. python之jieba分词库
  13. H5页面拉起第三方App
  14. FFT快速傅里叶变换 超详细的入门学习总结
  15. 作业4使用vi编辑器配置网络环境
  16. 无人机飞行控制源码(android)
  17. 这款 MySQL、Oracle、HDFS 数据同步工具,有点牛逼!
  18. 卸载windowsxp正版验证补丁
  19. 基于骨骼的动作识别:DD-Net
  20. 关于 GNSS 系统的信号频点频率 + 可用卫星

热门文章

  1. 使用更安全的C字符串操纵
  2. ES6基础教程一 学习笔记
  3. ruby学习--block
  4. 详述怎么使用Linux救援模式
  5. Oracle数据库的四种启动方式
  6. 剑指offer(C++)-JZ78:把二叉树打印成多行(数据结构-树)
  7. 剑指offer(C++)-JZ79:判断是不是平衡二叉树(数据结构-树)
  8. 宁德时代机器人编程开发_高通发布5G机器人开发平台,内置强大AI算力。各大厂商竞相发布机器人处理平台,万物互联的时代即将到来...
  9. mysql 存储ts数据_理解性记忆MySQL数据库
  10. 搭建java框架写CRD_硬核:如何开发一个Operator