ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

pytorch的Variable和Parameters的联系和区别

2021-12-14 10:33:14  阅读:282  来源: 互联网

标签:Parameters grad torch requires pytorch True Variable Parameter


文章目录

前言

首先看一下官方文档:
在这里插入图片描述

在这里插入图片描述

一、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,在参数量大时更加方便。

标签:Parameters,grad,torch,requires,pytorch,True,Variable,Parameter
来源: https://blog.csdn.net/PETERPARKERRR/article/details/121920647

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有