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.Tensor
和torch.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()
就可以了(前提是tensor
是requires_grad
)
知识是不断更新迭代的,在通过这几天学Pytorch的Autograd的过程中,理解其本身远比找别人的老虎画自己的猫要有意义,虽然过程是困难的,但是不就是硬实力吗?最后我再推荐 CSDN作者ronghuaiyang 的这篇颇有深度的关于Autograd的文章
更多详情请查看Pytorch官网
文中有引用简书上博主:与阳光共进早餐 的引述
预备知识1.matplotlib的基本用法和常识
预备知识2.Pytorch下的线代
预备知识3.pandas的基本用法
posted on 2021-12-10 12:16 YangShusen' 阅读(394) 评论(0) 编辑 收藏 举报