pytorch设置param.requires_grad = false,为什么训练后参数还在更新
时间: 2024-05-02 10:18:19 浏览: 261
Pytorch训练过程中改变模型参数 requires_grad 属性
5星 · 资源好评率100%
在PyTorch中,设置参数的requires_grad属性为False可以将其标记为不需要梯度计算,从而不会在反向传播过程中更新该参数的梯度值。然而,即使将参数的requires_grad属性设置为False,如果在模型中使用了该参数进行计算,该参数仍然会被更新,因为PyTorch会根据计算图自动推导出需要更新的参数。
例如,假设模型中的某个层使用了一个requires_grad为False的参数进行计算:
```
class MyModel(nn.Module):
def __init__(self):
super(MyModel, self).__init__()
self.fc = nn.Linear(10, 1, bias=False)
self.fc.weight.requires_grad = False
def forward(self, x):
out = self.fc(x)
return out
```
在训练过程中,即使将该参数的requires_grad属性设置为False,该参数仍然会被更新:
```
model = MyModel()
optimizer = torch.optim.SGD(model.parameters(), lr=0.1)
for i in range(10):
x = torch.randn(1, 10)
y = torch.randn(1, 1)
optimizer.zero_grad()
output = model(x)
loss = nn.functional.mse_loss(output, y)
loss.backward()
optimizer.step()
print(model.fc.weight)
```
输出结果为:
```
tensor([[-0.0233, 0.0133, 0.1036, 0.0312, -0.0608, -0.1007, -0.1006, -0.0221,
-0.0030, 0.0778]])
```
可以看到,虽然将fc层的权重设置为不需要梯度计算,但是该参数仍然被更新了。这是因为在反向传播过程中,PyTorch会根据计算图自动推导出需要更新的参数,而不是根据requires_grad属性来确定需要更新的参数。因此,在模型中使用参数进行计算时,即使将其requires_grad属性设置为False,该参数仍然可能被更新。
阅读全文