在pytorch中引入nn.Parameter的目的

时间:2018-07-17 05:38:02

标签: python neural-network deep-learning pytorch

我是Pytorch的新手,对nn.Parameterautograd.Variable之间的区别感到困惑。我知道前一个是Variable的子类,并且具有渐变。但是我真的不明白为什么我们引入Parameter以及何时使用它?


摘要

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

1 个答案:

答案 0 :(得分:3)

从文档中:

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

例如,初始化优化器时要考虑以下问题:

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

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

Pytorch 0.4中仍存在

Variable,但已弃用。从文档中:

Variable API已被弃用:Variable不再需要与张量一起使用autograd。将Tensors设置为requires_grad时,Autograd自动支持True


Pytorch 0.4之前的版本

在0.4版之前的Pytorch中,需要将Tensor包裹在torch.autograd.Variable中,以便跟踪对其应用的操作并执行区分。来自Variable中0.3的文档:

包装张量并记录对其应用的操作。 VariableTensor对象周围的薄包装,它也保存了渐变w.r.t。它,以及对创建它的函数的引用。此参考允许追溯创建数据的整个操作链。如果Variable是用户创建的,则其grad_fn将是None,我们称此类对象为叶子Variables。 由于autograd仅支持标量值函数微分,因此grad的大小始终与data的大小匹配。另外,grad通常仅分配给叶变量,否则将始终为零。

Parameter的差异大致相同。来自Parameters中0.3的文档:

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

另一个区别是,参数不能不稳定,并且默认情况下需要渐变。