如何在PyTorch中冻结模型指定层(如nn.Linear)的部分参数?
PyTorch中冻结线性层指定输出对应的参数方法
线性层nn.Linear(n, 3)的参数结构如下:
fc.weight:形状为(3, n),每一行对应一个输出节点的权重参数fc.bias:形状为(3,),每个元素对应一个输出节点的偏置参数
第三个输出节点对应的是索引为2的权重行和偏置元素(PyTorch张量索引从0开始),以下是两种冻结这些参数的实现方法:
方法一:直接设置参数的requires_grad属性
通过将目标参数的requires_grad设为False,反向传播时不会计算这些参数的梯度,自然不会被优化器更新:
import torch.nn as nn n = 10 # 替换为你的实际输入维度 fc = nn.Linear(n, 3) # 冻结第三个输出对应的权重行 fc.weight[2].requires_grad = False # 冻结第三个输出对应的偏置 fc.bias[2].requires_grad = False
方法二:优化器仅传入需训练的参数
在初始化优化器时,只传入需要更新的参数(即排除第三个输出对应的参数),这样优化器不会对冻结参数执行更新操作:
import torch.optim as optim # 收集需要训练的参数:前两个输出的权重和偏置 trainable_params = [ fc.weight[:2], fc.bias[:2] ] # 初始化优化器,仅传入可训练参数 optimizer = optim.SGD(trainable_params, lr=0.01)
注意事项
- 如果后续需要解冻参数,只需将对应参数的
requires_grad重新设为True即可 - 若使用方法二,建议在设置好
requires_grad后再初始化优化器,避免遗漏参数状态变化
内容的提问来源于stack exchange,提问作者Nard Li
相关产品推荐
相关产品推荐

