PyTorch:如何固定nn.Linear权重?参数双张量及赋值失败问题
解答你的PyTorch nn.Linear相关问题
先来说说你遇到的直接修改参数列表元素不生效的问题:
你尝试通过list(M.linear1.parameters())[0] = torch.Tensor([[-0.1], [0.2]])修改权重,但发现没有变化。这是因为model.parameters()返回的是一个生成器,转换成列表后得到的是临时的参数引用副本,直接修改列表元素并不会影响模型内部实际存储的参数。
正确修改nn.Linear参数的方式
如果要手动设置权重,你可以直接操作参数的data属性,或者重新赋值为Parameter对象:
# 方式1:修改data属性(保留原有requires_grad状态) M.linear1.weight.data = torch.Tensor([[-0.1], [0.2]]).double() # 方式2:重新赋值为Parameter(可自定义requires_grad) M.linear1.weight = torch.nn.Parameter(torch.Tensor([[-0.1], [0.2]]).double(), requires_grad=True)
为什么nn.Linear的参数列表中有两个张量?
nn.Linear(in_features, out_features)默认会创建两个可训练参数:
- 第一个是权重张量(weight):形状为
(out_features, in_features),对应线性变换中的权重矩阵 - 第二个是偏置张量(bias):形状为
(out_features,),对应线性变换中的偏置项,默认启用(你可以在初始化时设置bias=False来禁用它)
你打印的输出里,第一个张量是linear1的权重(2行1列,对应out_features=2,in_features=1),第二个是长度为2的偏置向量。
如何固定torch.nn.Linear的权重?
要固定权重不让它在训练中更新,有几种常用方法:
设置参数的requires_grad为False
这会让PyTorch不再计算该参数的梯度,优化器也不会更新它:# 固定linear1的权重 M.linear1.weight.requires_grad = False # 如果连偏置也要固定 M.linear1.bias.requires_grad = False优化器中排除不需要更新的参数
初始化优化器时,只传入需要训练的参数,比如只训练linear2和linear3的参数:optimizer = torch.optim.SGD([ {'params': M.linear2.parameters()}, {'params': M.linear3.parameters()} ], lr=0.01)训练时用detach()截断梯度
如果只是临时不想让权重更新,可以在前向传播时对权重做detach操作,但这种方法不如前两种常用:def forward(self, x): # 固定linear1的权重,不参与梯度更新 x = F.relu(F.linear(x, self.linear1.weight.detach(), self.linear1.bias.detach())) x = F.relu(self.linear2(x)) x = self.linear3(x) return x
内容的提问来源于stack exchange,提问作者Begiiiner
相关产品推荐
相关产品推荐

