PyTorch入门学习(二):Autogard之自动求梯度

autograd包是PyTorch中神经网络的核心部分,简单学习一下.

autograd提供了所有张量操作的自动求微分功能. 它的灵活性体现在可以通过代码的运行来决定反向传播的过程, 这样就使得每一次的迭代都可以是不一样的.

Variable类

  • autograd.Variable是这个包中的核心类.
  • 它封装了Tensor,并且支持了几乎所有Tensor的操作.
  • 一旦你完成张量计算之后就可以调用.backward()函数,它会帮你把所有的梯度计算好.
  • 通过Variable的.data属性可以获取到张量.
  • 通过Variabe的.grad属性可以获取到梯度.

下图是Variable的结构图:

Function类

  • 对于实现自动求梯度还有一个很重要的类就是autograd.Function.
  • VariableFunction一起构建了非循环图,完成了前向传播的计算.
  • 每个通过Function函数计算得到的变量都有一个.grad_fn属性.
  • 用户自己定义的变量(不是通过函数计算得到的)的.grad_fn值为空.
  • 如果想计算某个变量的梯度,可以调用.backward()函数:
    1.当变量是标量的时候不需要指定任何参数.
    2.当变量不是标量的时候,需要指定一个跟该变量同样大小的张量grad_output用来存放计算好的梯度.

代码示例

  • import packet
import torch
from torch.autograd import Variable
  • Create a variable
x=Variable(torch.ones(2,2),requires_grad=True)
print (x)

  • Do an operation of variable
y=x+2
print(y)

  • grad_fn attribute
    这里的x是属于用户自己定义的,而y属于函数产生的,所以y有grad_fn属性,而x没有.
print (x.grad_fn)
print (y.grad_fn)

  • more operations on y
z = y * y * 3
out = z.mean()
print(z, out)

Gradients

如果你跟着上面的代码做下来的话,上面已经完成了变量x及计算函数的定义.
现在我们就可以用backward()自动求导啦.

out.backward()
print(x.grad)

反向计算得到的梯度如下所示:

  • 这里的out为标量,所以直接调用backward()函数即可.
  • 一定要注意当out为数组时,用先定义一样大小的Tensor例如grad_output执行.backgrad(grad_output)语句.

以上就基本完成了前向传播建立计算图以及反向传播求梯度的过程.

原文地址:https://www.cnblogs.com/jfdwd/p/11434382.html

时间: 2024-08-30 16:28:21

PyTorch入门学习(二):Autogard之自动求梯度的相关文章

MongoDB入门学习(二):MongoDB的基本概念和数据类型

上一篇讲了MongoDB的安装和管理,其中涉及到了一些概念,数据结构还有一些API的调用,不知道的没关系,其实很简单,这篇会简单介绍一下. 1.文档 文档是MongoDB的核心概念,多个键值对有序的放在一起就是一个文档,文档是MongoDB存储数据最基本的数据结构.对MongoDB都是以文档的形式来操作的,使用了一种类似JSON的二进制BSON数据格式,对API的调用都是传的文档参数.每种编程语言都有标示文档的数据结构,比如java的map,lua的table,python的dict等等,但是都

SpringMVC入门学习(二)

SpringMVC入门学习(二) ssm框架 springMVC 在上一篇博客中,我简单介绍了一下SpringMVC的环境配置,和简单的使用,今天我们将进一步的学习下Springmvc的操作. model.addAttribute()的使用 model接口的源代码: 由图可知,在addAttribute()中有两种入参方式,一种是指明名字var1,一种是不指明名字var1.在不指明名字中,会通过相近的去寻找. 在addAttribute()中,我们可以放任何对象: 首先先导入jsp标签maven

自动求梯度(pytorch版本)——2.20

一.Tensor用于自动求梯度 "tensor"这个单词?般可译作"张量",张量可以看作是?个多维数组.标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是?维张量. ????在深度学习中,我们经常需要对函数求梯度(gradient).PyTorch提供的autograd 包能够根据输?和前向传播过程?动构建计算图,并执?反向传播.本节将介绍如何使?autograd包来进??动求梯度的有关操作. 概念 ????Pytorch中的Tensor 是这个包的核?类

Objective C 快速入门学习二

Objective-C 类.对象.方法 1.编写一个复数类: #import <Foundation/Foundation.h>@interface Complex: NSObject //类声明,Complex继承NSObject { int iReal;//成员变量声明,在括号内 int iImag; } //成员函数声明,在括号外 -(void) print; -(void) setReal : (int) n; -(void)setImag : (int) d; @end //@int

git入门学习(二):新建分支/上传代码/删除分支

一.git新建分支,上传代码到新的不同分支 我要实现的效果,即是多个内容的平行分支:这样做的主要目的是方便统一管理属于同一个内容的不同的项目,互不干扰.如图所示: 前提是我的github上已经有webpack_test项目了,我是在这个项目的基础上新建其他的分支并开展工作的.如图: 如果你对如何新建webpack_test项目不清楚,请参考我的前一篇文章:git入门学习(一):github for windows上传本地项目到github,操作步骤如下: 1.1.保留webpack_test项目

activiti入门学习二

一.上一篇入门学习的地址 https://www.cnblogs.com/yangk1996/p/10878449.html 二.单机演示Demo 12.使用UEL表达式动态增加流程处理人 从新创建一个流程,使其Assignee变成表达式的.然后从新创建流程. * @Description: 启动流程实例,动态设置assignee * @date: 2019/6/23 20:28 */ public class AssigneeUel { public static void main(Stri

『PyTorch』第三弹_自动求导

torch.autograd 包提供Tensor所有操作的自动求导方法. 数据结构介绍 autograd.Variable 这是这个包中最核心的类. 它包装了一个Tensor,并且几乎支持所有的定义在其上的操作.一旦完成了你的运算,你可以调用 .backward()来自动计算出所有的梯度,Variable有三个属性: 访问原始的tensor使用属性.data: 关于这一Variable的梯度则集中于 .grad: .creator反映了创建者,标识了是否由用户使用.Variable直接创建(No

Pytorch入门实战二:LeNet、AleNet、VGG、GoogLeNet、ResNet模型详解

LeNet 1998年,LeCun提出了第一个真正的卷积神经网络,也是整个神经网络的开山之作,称为LeNet,现在主要指的是LeNet5或LeNet-5,如图1.1所示.它的主要特征是将卷积层和下采样层相结合作为网络的基本机构,如果不计输入层,该模型共7层,包括2个卷积层,2个下采样层,3个全连接层. 图1.1 注:由于在接入全连接层时,要将池化层的输出转换成全连接层需要的维度,因此,必须清晰的知道全连接层前feature map的大小.卷积层与池化层输出的图像大小,其计算如图1.2所示. 图1

java入门学习(二)

一.类和对象 1.开篇瞎BB 物以类聚. 世间万物皆对象,对象是能接触到的实体.类是一组有相同属性和方法的对象的集合,或者说它们的特征提取,类是一种抽象的概念.类由属性和方法组成,属性是它的各种静态的特征,方法是它能干啥.<易>有云,“物以类聚,人以群分”. 打个比喻,有一群人都在追一个很可爱的姑娘.这群人可以抽象出一个类,他们有相同的属性,比如都喜欢这姑娘,都是男孩子.他们有一些相同的方法,什么送花儿呀,请吃饭呀,请看电影呀,陪姑娘聊天呀.所以呀,他们是一个类.而单独的一个人就是一个对象,这