讲师中心 微信公众号
AI工具推荐 视频效率加速

Python中如何修改PyTorch预训练模型最后一层_全连接层替换与分类数动态映射

酷萱姑娘_9740

酷萱姑娘_9740

发布时间:2026-04-15 10:10:22

|

964人浏览过

|

来源于php中文网

原创

直接修改模型最后一层需先确认其命名和结构,如ResNet用fc、VGG用classifier、ViT用heads;获取原in_features后新建nn.Linear(in_features, num_classes),并重置参数以避免残留旧值。

python中如何修改pytorch预训练模型最后一层_全连接层替换与分类数动态映射

PyTorch预训练模型最后一层怎么替换成自定义分类数

直接改 model.classifier[-1] 或 model.fc 就行,但必须先确认原模型结构——不同 backbone 的输出层命名和位置差异很大,硬套会报 AttributeError: 'Sequential' object has no attribute 'fc' 这类错。

实操建议:

  • 用 print(model) 或 list(model.children())[-1] 查最后一级模块名,比如 resnet50 是 fc,vgg16 是 classifier,vit_b_16 是 heads
  • 替换前记录原输出维度:in_features = model.fc.in_features(ResNet)或 model.classifier[-1].in_features(VGG),这是新层的 in_features 依据
  • 新层必须用 nn.Linear(in_features, num_classes),不能漏掉 num_classes —— 这是你要的分类数,不是原数据集的类别数

替换后权重初始化要不要重置

要。新层参数默认已随机初始化,但如果你手动创建了 nn.Linear 却没调用 reset_parameters(),可能残留旧值(尤其从 checkpoint 加载后部分替换时)。

常见疏漏点:

立即学习“Python免费学习笔记(深入)”;

Li Python Sec Check
Li Python Sec Check

Python 安全规范检查工具:基于 CloudBase 规范、腾讯安全指南,LLM 智能分析(默认禁用,优先本地执行)

下载
  • 只改了结构,没清缓存:训练前务必调用 model.apply(lambda m: m.reset_parameters() if isinstance(m, nn.Linear) else None),或者更稳妥地只重置你刚换的新层
  • 用了 nn.Sequential 包裹新层但忘了给它起名,导致无法单独 reset —— 建议显式赋值:model.fc = nn.Linear(2048, 12),而非 model.classifier = nn.Sequential(..., new_layer)
  • ViT 类模型(如 vit_b_16)的 heads 是 nn.Sequential(nn.Linear(...), nn.Dropout(), nn.Linear(...)),只换最后那个 nn.Linear 即可,别把整个 heads 替掉

动态映射分类数时如何避免 forward 报错

核心是确保新层输入特征维度与上游输出一致。典型错误是修改 num_classes 后忘记同步调整 in_features,导致 mat1 and mat2 shapes cannot be multiplied。

检查步骤:

  • 打印上游模块输出 shape:with torch.no_grad(): print(model.features(torch.randn(1,3,224,224)).shape)(对 CNN)或 model.encoder(torch.randn(1,3,224,224)).shape(ViT),确认最后一维是否等于你设的 in_features
  • 若用 torchvision.models.get_model('resnet50', weights='DEFAULT'),注意 0.14+ 版本返回的是带预处理的 wrapper,需访问 .model 属性才能拿到纯模型
  • 迁移学习微调时,冻结参数(requires_grad = False)只需加在特征提取部分,新分类层必须保持 True,否则 loss 不下降

多任务或增量学习场景下怎么安全替换

不能直接覆盖原层变量名,否则旧层参数仍留在 model.state_dict() 里,保存加载时会冲突。

正确做法:

  • 先删旧键:state_dict = model.state_dict(); state_dict.pop('fc.weight', None); state_dict.pop('fc.bias', None),再 load 新权重
  • 用 strict=False 加载 checkpoint:model.load_state_dict(checkpoint, strict=False),缺失的 key(新层)自动跳过,多出的 key(旧层)也忽略
  • 如果新增类别数比原来少(比如从1000→10),不要复用原 fc.weight[:10] —— 初始化更稳;若想保留语义相似性,可用 PCA 降维后再初始化,但非常规操作
实际替换最常卡在模型结构认知偏差上:以为所有模型都叫 fc,结果在 EfficientNet 上死磕 model.fc 却找不到。动手前花 10 秒 print(model) 看一眼,比查文档快。

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

1671

2023.07.20

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

4224

2023.07.25

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1669

2023.07.31

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

24537

2023.08.03

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3007

2023.08.04

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

3027

2023.08.04

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

1163

2023.08.11

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

596

2023.08.10

C++运算符基础入门
C++运算符基础入门

本专题详细讲解了C++运算符的类型、语法与使用方法,涵盖算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、条件运算符及其他特殊运算符,并通过代码示例解析优先级与结合性。

0

2026.10.09

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn