如何在PyTorch与TensorFlow中固定神经网络层权重并允许偏置更新
PyTorch 实现方案
要固定输入层权重、仅更新偏置,核心是禁用权重参数的梯度计算,优化器会自动跳过无梯度的参数更新,无需手动重置权重:
步骤1:定义模型后,将输入层的
weight参数的requires_grad设为Falseimport 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
相关产品推荐
相关产品推荐

