在pytorch中引入nn.Parameter的目的

Fes*_*nXu 4 python neural-network deep-learning pytorch

我是新来Pytorch和我感到困惑的区别nn.Parameterautograd.Variable。我知道前一个是 的子类Variable并且具有梯度。但是我真的不明白我们为什么要引入Parameter,什么时候应该使用它?


总结

感谢iacolippo的解释,我终于明白了parameter和的区别variable。总而言之,variablepytorch 中的variable与 tensorflow 中的不同,前者不附加到模型的可训练参数,而后者会。附加到模型意味着使用model.parameters()将返回某个参数给你,这在训练阶段指定训练所需的变量很有用。“变量”作为某些网络中的缓存更有帮助。

iac*_*ppo 5

从文档:

ParametersTensor子类,与Modules 一起使用时具有非常特殊的属性- 当它们被分配为Module属性时,它们会自动添加到其参数列表中,并且将出现在例如parameters()迭代器中。分配张量没有这样的效果。这是因为人们可能希望在模型中缓存一些临时状态,例如 的最后隐藏状态RNN。如果没有这样的类Parameter,这些临时对象也会被注册。

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

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

优化器将只更新已注册Parameters的模型。

Variables 仍然存在于 Pytorch 0.4 中,但它们已被弃用。从文档:

VariableAPI已被弃用:Variables为不再需要使用autograd与张量。Autograd自动支持Tensorsrequires_grad集来True


0.4 之前的 Pytorch

在 0.4 版本之前的 Pytorch 中,需要将 a 包装Tensor在 atorch.autograd.Variable中,以便跟踪应用于它的操作并执行微分。来自Variable0.3的文档:

包装一个张量并记录应用于它的操作。 Variable是一个围绕Tensor对象的薄包装器,它还保存了它的梯度,以及对创建它的函数的引用。此引用允许追溯创建数据的整个操作链。如果Variable已由用户创建,则其grad_fn将是None,我们称此类对象为 Leaf Variables。由于autograd仅支持标量值函数微分,因此grad大小始终与data大小匹配。此外,grad通常仅分配给叶变量,否则将始终为零。

wrt 的差异Parameter或多或少是相同的。来自Parameters0.3的文档:

一种Variable被认为是模块参数。 ParametersVariable子类,与Modules 一起使用时具有非常特殊的属性- 当它们被分配为Module属性时,它们会自动添加到其参数列表中,并且将出现在例如parameters()迭代器中。分配 aVariable没有这样的效果。这是因为人们可能希望在模型中缓存一些临时状态,例如 RNN 的最后一个隐藏状态。如果没有这样的类Parameter,这些临时对象也会被注册。

另一个区别是参数不能是 volatile 并且默认情况下它们需要梯度。