我是Pytorch的新手,对nn.Parameter
和autograd.Variable
之间的区别感到困惑。我知道前一个是Variable
的子类,并且具有渐变。但是我真的不明白为什么我们引入Parameter
以及何时使用它?
摘要:
感谢iacolippo的解释,我终于了解了parameter
和variable
之间的区别。总而言之,pytorch中的variable
与tensorflow中的variable
不同,前者未附加到模型的可训练参数上,而后者则未附加到模型的可训练参数上。附加到模型意味着使用model.parameters()
将向您返回特定参数,这在训练阶段用于指定训练所需的变量很有用。 “变量”作为某些网络中的缓存更为有用。
答案 0 :(得分:3)
从文档中:
Parameters
是Tensor
的子类,与Module
s一起使用时具有非常特殊的属性-当它们被分配为Module
属性时,它们会自动添加到其参数列表,并会出现例如在parameters()
迭代器中。分配张量不会产生这种效果。这是因为可能要在模型中缓存一些临时状态,例如RNN
的最后一个隐藏状态。如果没有Parameter
这样的类,这些临时人员也将被注册。
例如,初始化优化器时要考虑以下问题:
optim.SGD(model.parameters(), lr=1e-3)
优化器将仅更新已注册的模型Parameters
。
Variable
,但已弃用。从文档中:
Variable
API已被弃用:Variable
不再需要与张量一起使用autograd
。将Tensors
设置为requires_grad
时,Autograd自动支持True
。
在0.4版之前的Pytorch中,需要将Tensor
包裹在torch.autograd.Variable
中,以便跟踪对其应用的操作并执行区分。来自Variable
中0.3的文档:
包装张量并记录对其应用的操作。
Variable
是Tensor
对象周围的薄包装,它也保存了渐变w.r.t。它,以及对创建它的函数的引用。此参考允许追溯创建数据的整个操作链。如果Variable
是用户创建的,则其grad_fn
将是None
,我们称此类对象为叶子Variables
。
由于autograd
仅支持标量值函数微分,因此grad
的大小始终与data
的大小匹配。另外,grad
通常仅分配给叶变量,否则将始终为零。
与Parameter
的差异大致相同。来自Parameters
中0.3的文档:
一种Variable
,将被视为模块参数。
Parameters
是Variable
的子类,与Module
s一起使用时具有非常特殊的属性-当将它们分配为Module
属性时,它们会自动添加到其列表中参数,并会出现,例如在parameters()
迭代器中。分配Variable
不会产生这种效果。这是因为可能要在模型中缓存一些临时状态,例如RNN的最后一个隐藏状态。如果没有Parameter
这样的类,这些临时人员也将被注册。
另一个区别是,参数不能不稳定,并且默认情况下需要渐变。