在PyTorch中,如何在训练期间使某些模块的“参数”静态化?

时间:2019-05-02 20:38:30

标签: python pytorch

上下文:

在pytorch中,任何ParameterTensor的一种特殊类型。将Parameter分配为模块的parameters()方法时将其自动注册为属性。

在培训期间,我会将m.parameters()传递给Optimizer实例,以便可以对其进行更新。


问题:对于内置的pytorch模块,如何防止某些参数被优化程序修改?

s = Sequential(
        nn.Linear(2,2),
        nn.Linear(2,3),   # I want this one's .weight and .bias to be constant
        nn.Linear(3,1)
    )
  • 我能做到使其不出现在s.parameters()中吗?
  • 我可以将参数设为只读,以便忽略任何尝试的更改吗?

1 个答案:

答案 0 :(得分:0)

可以通过设置参数的属性requires_grad=False将其设为静态。

在我的示例中:

params = list(s.parameters())  # .parameters() returns a generator
# Each linear layer has 2 parameters (.weight and .bias),
# Skipping first layer's parameters (indices 0, 1):
params[2].requires_grad = False
params[3].requires_grad = False

使用requires_grad=Truerequires_grad=False张量的混合进行计算时,结果继承requires_grad=True

根据PyTorch autograd mechanics documentation

  

如果一个操作的单个输入需要渐变,则其输出也将需要渐变。相反,仅当所有输入都不需要渐变时,输出也才不需要渐变。在所有张量都不要求渐变的子图中,永远不会执行向后计算。


我担心的是,如果我禁用中间层的渐变跟踪,则第一层将不会接收反向传播的渐变。这是错误的理解。

边缘案例:如果我在模块中为 all 参数禁用了渐变并尝试进行训练,那么优化器将引发异常。因为没有单个张量要应用backward()传递。

这种极端情况是为什么我遇到错误。我试图用单个requires_grad=False层在模块的参数上测试nn.Linear。这意味着我禁用了对 all 参数的跟踪,这导致优化程序抱怨。