文章目录
前言
首先看一下官方文档:
一、Variable
torch.autograd.Variable
Variable是对Tensor的封装,操作与tensor基本一致,不同的是,每一个Variable被构建的时候,都包含三个属性:
1、data:Variable中所包含的tensor
2、grad:tensor的梯度 .grad
3、以何种方式得到这种梯度 .grad_fn
之所以有Variable这个数据结构,是为了引入计算图(自动求导),方便构建神经网络。通过调用backward(),我们可以对某个Variable(譬如说y)只进行一次自动求导,但如果我们再对这个Variable进行一次backward()操作,会发现程序报错。这是因为PyTorch默认做完一次自动求导后,就把计算图丢弃了。我们可以通过设置retain_graph = True,保留计算图,来实现多次求导。
作者:双听
链接:https://www.jianshu.com/p/cb739922ce88
来源:简书
操作下面用例子说明:
from torch.autograd import Variable
a = torch.randn(10, 5)
b = torch.randn(10, 5)
x = Variable(a, requires_grad=True)
y = Variable(b, requires_grad=True)
z = x + y
z.backward(retain_graph=True)
x.grad # x的梯度 10x1 的全1tensor
z.grad_fn
二、Parameter
torch.nn.Parameter(是Variable的子类)
如果在网络的训练过程中需要更新,就要定义为Parameter, 类似为W(权重)和b(偏置)也都是Parameter
Variable默认是不需要求梯度的,还需要手动设置参数 requires_grad=True。Variable因为要多次反向传播,那么在backward的时候还要手动注明参数(),就非常麻烦。
Pytorch主要通过引入nn.Parameter类型的变量和optimizer机制来解决了这个问题。Parameter是Variable的子类,本质上和后者一样,只不过parameter默认是求梯度的,同时一个网络中的parameter变量是可以通过 net.parameters() 来很方便地访问到的,只需将网络中所有需要训练更新的参数定义为Parameter类型,再用以optimizer,就能够完成所有参数的更新了,例如:optimizer = torch.optim.SGD(net.parameters(), lr=1e-1)
总结
Variable,Parameter和torch.tensor()
相同点
:torch.tensor()、torch.autograd.Variable和torch.nn.Parameter 基本一样。
前两者都可以设置requires_grad参数,后者则直接默认requires_grad=True。
三者都拥有.data,.grad,.grad_fn等属性。
所以,只要requires_grad=True,都可以计算梯度以及backward()。
不同之处:
torch.nn.Parameter,直接默认requires_grad=True,在参数量大时更加方便。