Python 在pytorch中引入nn.参数的目的

Python 在pytorch中引入nn.参数的目的,python,neural-network,deep-learning,pytorch,Python,Neural Network,Deep Learning,Pytorch,我是Pytorch的新手,对nn.Parameter和autograd.Variable之间的区别感到困惑。我知道前者是变量的子类,具有梯度。但是我真的不明白为什么我们要引入参数以及什么时候应该使用它 摘要: 感谢iacolippo的解释,我终于理解了参数和变量之间的区别。总之,pytorch中的变量与tensorflow中的变量不同,前者不附加到模型的可训练参数,而后者将附加到模型的可训练参数。附加到模型意味着使用model.parameters()将向您返回特定参数,这在培训阶段用于指定培

我是Pytorch的新手,对
nn.Parameter
autograd.Variable
之间的区别感到困惑。我知道前者是
变量
的子类,具有梯度。但是我真的不明白为什么我们要引入
参数
以及什么时候应该使用它


摘要


感谢iacolippo的解释,我终于理解了
参数
变量
之间的区别。总之,pytorch中的
变量
与tensorflow中的
变量
不同,前者不附加到模型的可训练参数,而后者将附加到模型的可训练参数。附加到模型意味着使用
model.parameters()
将向您返回特定参数,这在培训阶段用于指定培训所需的变量。“变量”在某些网络中作为缓存更有用。

来自文档:

Parameters
Tensor
子类,当与
Module
s一起使用时,它们具有非常特殊的属性-当它们被指定为
Module
属性时,它们会自动添加到其参数列表中,并显示在
Parameters()
迭代器中。分配张量没有这种效果。这是因为可能需要在模型中缓存一些临时状态,如
RNN
的最后一个隐藏状态。如果没有像
Parameter
这样的类,这些临时变量也会被注册

例如,当您初始化优化器时,请考虑:

optim.SGD(model.parameters(),lr=1e-3)

优化器将只更新模型的注册参数

变量
s仍存在于Pytorch 0.4中,但已弃用。从文档中:

变量
API已被弃用:
变量
s不再需要与张量一起使用
自动加载
。自动加载自动支持
张量
,并将
requires\u grad
设置为
True


Pytorch pre-0.4 在0.4版之前的Pytorch中,需要将
张量
包装在
torch.autograd.Variable
中,以便跟踪应用于它的操作并执行区分。从0.3中的
变量的文档中:

包装张量并记录应用于它的操作。
Variable
是一个围绕
Tensor
对象的薄包装器,它还包含对它的梯度w.r.t.,以及对创建它的函数的引用。此引用允许追溯创建数据的整个操作链。如果
变量
是由用户创建的,那么它的
梯度fn
将是
,我们称这些对象为叶
变量
。 由于
autograd
仅支持标量值函数微分,
grad
大小始终与
数据
大小匹配。另外,
grad
通常仅分配给叶变量,否则将始终为零

wrt
参数
的差异大致相同。从0.3中的
参数的文档中:

一种被视为模块参数的
变量
参数
变量
子类,与
模块
s一起使用时具有非常特殊的属性-当它们被指定为
模块
属性时,它们会自动添加到其参数列表中,并将出现在
参数()
迭代器中。分配
变量
没有这种效果。这是因为可能需要在模型中缓存一些临时状态,比如RNN的最后一个隐藏状态。如果没有像
Parameter
这样的类,这些临时变量也会被注册


另一个区别是参数不能是易变的,默认情况下它们需要渐变。

切换到0.4版本,您就没有变量了。@Paddy Hi Paddy,切换到0.4.0版本后,我仍然有变量您不需要使用变量。对于后面的回答,我很抱歉。谢谢,现在我知道pytorch中的参数就像tensorflow中的变量一样。出于好奇,为什么pytorch在版本0.4.0之前引入了该参数?在0.4.0版本之前,参数和变量之间有什么区别吗?我知道了。看起来“variable”很有用,那么为什么不推荐使用它呢?不推荐使用它是因为Tensor现在具有这种行为,而不需要将它包装到另一个类中