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

如何在PyTorch与TensorFlow中固定神经网络层权重并允许偏置更新

PyTorch 实现方案

要固定输入层权重、仅更新偏置,核心是禁用权重参数的梯度计算,优化器会自动跳过无梯度的参数更新,无需手动重置权重:

  • 步骤1:定义模型后,将输入层的weight参数的requires_grad设为False

    import torch
    import torch.nn as nn
    
    class MyModel(nn.Module):
        def __init__(self):
            super().__init__()
            self.input_layer = nn.Linear(10, 20)  # 输入层:10维输入→20维输出
            self.hidden = nn.Linear(20, 30)
            self.output = nn.Linear(30, 5)
    
    model = MyModel()
    # 冻结输入层权重,仅保留偏置的梯度计算
    model.input_layer.weight.requires_grad = False
    
  • 步骤2:定义优化器时,只需传入requires_grad=True的参数(或显式指定要更新的参数)

    # 方式1:自动筛选所有可训练参数
    optimizer = torch.optim.SGD(
        [p for p in model.parameters() if p.requires_grad],
        lr=0.01
    )
    
    # 方式2:显式指定需要更新的参数(更直观)
    optimizer = torch.optim.SGD(
        [
            model.input_layer.bias,
            model.hidden.weight,
            model.hidden.bias,
            model.output.weight,
            model.output.bias
        ],
        lr=0.01
    )
    

训练时,输入层权重不会被计算梯度,优化器也不会更新它,完全不需要每个epoch重置权重,效率大幅提升。

TensorFlow 实现方案

TensorFlow通过设置参数的trainable属性来控制是否参与训练,同样可以精准冻结权重、保留偏置的更新权限:

方法1:定义层时直接指定

在创建输入层时,单独设置权重(kernel)不可训练、偏置可训练:

import tensorflow as tf

# 定义输入层:权重不可训练,偏置可训练
input_layer = tf.keras.layers.Dense(
    20,
    input_shape=(10,),
    kernel_trainable=False,  # 冻结权重
    bias_trainable=True      # 允许偏置更新
)

model = tf.keras.Sequential([
    input_layer,
    tf.keras.layers.Dense(30),
    tf.keras.layers.Dense(5)
])

model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01), loss='sparse_categorical_crossentropy')

方法2:事后修改层参数的可训练属性

如果已经定义好模型,可以单独修改输入层权重和偏置的trainable状态:

model = tf.keras.Sequential([
    tf.keras.layers.Dense(20, input_shape=(10,), name='input_layer'),
    tf.keras.layers.Dense(30),
    tf.keras.layers.Dense(5)
])

# 先冻结整个输入层,再单独启用偏置的训练权限
model.get_layer('input_layer').trainable = False
model.get_layer('input_layer').bias.trainable = True

model.compile(optimizer=tf.keras.optimizers.SGD(learning_rate=0.01), loss='sparse_categorical_crossentropy')

无论哪种方式,训练时优化器只会更新trainable=True的参数,无需手动重置权重,底层自动跳过冻结参数的梯度计算和更新。

内容的提问来源于stack exchange,提问作者user5497794

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 23:07:14