返回顶部

请叫我杨先生

导航

Pytorch 2.2 Autogard: Pytorch中的梯度计算

Autogard:Pytorch中的梯度计算

用PyTorch构建的神经网络,其梯度计算是通过torch.autograd来完成的。当我们进行了一系列计算,并想获取一些变量间的梯度信息,需要进行以下步骤:

  • 构建一个计算图,用Variable将Tensor包装起来,形成计算图中的节点。然后Variable之间进行各种运算就像Tensor之间的运算一样,Variable支持几乎所有的Tensor运算。
  • 当你进行完一系列运算之后,执行.backward()来自动计算出所有需要的梯度。
  • 来针对某个变量x执行x.grad获得想要的梯度值。

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

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

▷▷▷提示一点,当你看不懂解释的时候,你可以尽最大努力去实现代码,并且看懂它▷▷▷

import torch 
from torch.autograd import Variable 

def fn(x): 
    y = x**2*torch.exp(x)
    return y

def grad_fn(x): 
    dx = 2*x*torch.exp(x) + x**2*torch.exp(x)
    return dx

# 测试
x = Variable(torch.randn(3,4),requires_grad=True)
y = fn(x)

# torch.autograd自动求导时,执行
y.backward(torch.ones(y.size()))
x.grad == grad_fn(x)

输出的结果

tensor([[True, True, True, True],
        [True, True, True, True],
        [True, True, True, True]])

首先,Variable是一个torch.autograd中的一个类,我们要使用这个类里面的方法就得先实例化一个对象x=Variable(torch.randn(3,4),requires_grad=True) ,然后通过最终的计算图的点通过反向传播算法计算回去,按照我如上的代码也就是y.backward(torch.ones(y.size())) 这里使用torch.ones(y.size()的原因是我的x是一个Tensor,我需要另外开一个内存存放我的反向梯度参数数据,如果是标量的话就不必创建新的直接使用.backward() 就好了

如果还是不是很懂的话,请详细查看下我的代码以及注释,你可以尝试着去修改我代码中的函数以及其他参数,或许你就会豁然开朗了呢?

------------------------------------------2021/12/11更新----------------------------------------------------

引述 CSDN作者ronghuaiyang 的一段话:

张量:简单地说,它只是PyTorch中的一个n维数组。张量支持一些额外的增强,这使它们独一无二:除了CPU,它们可以加载或GPU更快的计算。在设置.requires_grad = True的时候,他们开始形成一个反向图,跟踪应用于他们的每个操作,使用所谓的动态计算图(DCG)计算梯度(后面会进一步解释)。
在早期版本的PyTorch中,使用torch.autograd.Variable类用于创建支持梯度计算和操作跟踪的张量,但截至PyTorch v0.4.0,Variable类已被禁用。torch.Tensortorch.autograd.Variable现在是同一个类。更准确地说, torch.Tensor能够跟踪历史并表现得像旧的Variable

而现在我们不用Variable这个类也能够使用Autograd了

import torch 
x = torch.tensor([1.,2.,3.,4.],requires_grad=True) # leaf node 叶子节点 is_leaf = True  
y = x**2 # 根节点 
dy = 2*x 
y.backward(torch.ones(y.size())) 
x.grad == dy 

输出的结果:

tensor([True, True, True, True])

-----------------------------2021/12/21更新 -------------------------------------------------------------

今天查阅Pytorch官网资料的时候无意发现如下:

  • The Variable API has been deprecated(弃用): Variables are no longer necessary to use autograd with tensors. Autograd automatically supports Tensors with requires_grad set to True. Below please find a quick guide on what has changed:
  • Variable(tensor) and Variable(tensor, requires_grad) still work as expected, but they return Tensors instead of Variables.
  • Methods such as var.backward(), var.detach(), var.register_hook() now work on tensors with the same method names. 这段话也就是说,以前的Variable 类创建出来的对象var调用var.backward()等方法才能够进行反向传播,而现在直接调用tensor.backward()就可以了(前提是tensorrequires_grad)

知识是不断更新迭代的,在通过这几天学Pytorch的Autograd的过程中,理解其本身远比找别人的老虎画自己的猫要有意义,虽然过程是困难的,但是不就是硬实力吗?最后我再推荐 CSDN作者ronghuaiyang 的这篇颇有深度的关于Autograd的文章

更多详情请查看Pytorch官网
文中有引用简书上博主:与阳光共进早餐 的引述

预备知识1.matplotlib的基本用法和常识
预备知识2.Pytorch下的线代
预备知识3.pandas的基本用法

posted on 2021-12-10 12:16  YangShusen'  阅读(394)  评论(0编辑  收藏  举报