You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的权重?

要固定权重不让它在训练中更新,有几种常用方法:

  1. 设置参数的requires_grad为False
    这会让PyTorch不再计算该参数的梯度,优化器也不会更新它:

    # 固定linear1的权重
    M.linear1.weight.requires_grad = False
    # 如果连偏置也要固定
    M.linear1.bias.requires_grad = False
    
  2. 优化器中排除不需要更新的参数
    初始化优化器时,只传入需要训练的参数,比如只训练linear2和linear3的参数:

    optimizer = torch.optim.SGD([
        {'params': M.linear2.parameters()},
        {'params': M.linear3.parameters()}
    ], lr=0.01)
    
  3. 训练时用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 11:22:30