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

PyTorch中如何冻结其余参数仅训练MoviNet自定义分类器?

PyTorch冻结MoviNet主干仅训练自定义分类器实现方案

1. 先冻结模型全部参数

加载完成预训练模型后,先全局关闭所有参数的梯度计算:

import torch

# 假设你已经完成自定义结构的模型实例化,变量名为model
for param in model.parameters():
    param.requires_grad = False

2. 仅解锁自定义clfr分类器的参数

遍历参数,将前缀为clfr.的参数梯度打开:

for name, param in model.named_parameters():
    if name.startswith("clfr."):
        param.requires_grad = True

3. 迁移原有预训练分类层权重到自定义结构

把原有预训练模型中分类层的权重,对应赋值到修改后的clfr层对应位置:

# 加载原始MoviNet预训练权重,假设预训练权重变量为pretrain_state_dict
pretrain_state_dict = torch.load("你的预训练权重路径", map_location="cpu")

# 建立新旧层参数名映射关系
weight_map = {
    "classifier.0.conv_1.conv2d.weight": "clfr.0.multi_head.0.head2.0.conv_1.conv2d.weight",
    "classifier.0.conv_1.conv2d.bias": "clfr.0.multi_head.0.head2.0.conv_1.conv2d.bias",
    "classifier.3.conv_1.conv2d.weight": "clfr.0.multi_head.0.head1.weight",
    "classifier.3.conv_1.conv2d.bias": "clfr.0.multi_head.0.head1.bias"
}

# 替换预训练权重的key为自定义结构的key
for old_key, new_key in weight_map.items():
    if old_key in pretrain_state_dict:
        pretrain_state_dict[new_key] = pretrain_state_dict.pop(old_key)

# 加载权重到自定义模型,strict=False忽略不匹配的key
model.load_state_dict(pretrain_state_dict, strict=False)

4. 优化器仅传入可训练参数

初始化优化器的时候过滤掉不需要更新的冻结参数,节省显存:

optimizer = torch.optim.Adam(
    filter(lambda p: p.requires_grad, model.parameters()),
    lr=1e-4 # 分类层学习率可以适当设高一点
)

验证配置是否生效

执行以下代码,输出的可训练参数应该仅有你自定义的clfr层相关参数:

trainable_params = [name for name, param in model.named_parameters() if param.requires_grad]
print("可训练参数列表:")
for name in trainable_params:
    print(name)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:24:00