2025年预训练模型怎么微调(预训练模型 微调)

预训练模型怎么微调(预训练模型 微调)p id E5 89 8D E8 A8 80 strong 引 言 strong p 在设计新模型的时候 尤其在 CV 领域设计语义分割 目标检测模型通常将已有的图像分类模型作为 backbone 根据任务需求 可以对原始模型结构的某层实施增删改操作

大家好,我是讯享网,很高兴认识大家。



 <p id="%E5%89%8D%E8%A8%80"><strong>引 言</strong></p> 

讯享网

在设计新模型的时候,尤其在CV领域设计语义分割、目标检测模型通常将已有的图像分类模型作为backbone,根据任务需求,可以对原始模型结构的某层实施增删改操作。由于目标任务的数据规模有限,为防止模型出现训练过拟合的情况,对于backbone部分的权重参数采用在大规模数据集ImageNet上预训练好的模型权重参数,这部分参数在模型funetuning阶段处于冻结状态不进行更新,只对新增网络层执行finetune操作。本文主要讲述常用的backone模块修改和加载预训练模型权重参数的方法及如何冻结部分权重参数对新引入层进行微调操作。

目 录

 一.模型设计

1.增加网络层和删除网络层

2.替换网络层

3.提取网络层

4.构建自定义模型

二、预训练模型权重加载

三、冻结部分权重参数并finetune

四、总 结


预训练模型权重文件下载地址:

vision/torchvision/models at main · pytorch/vision · GitHub

增加网络层可以利用add_module(name,module)函数

讯享网

显示网络结构:

 

 删除某层可以使用del * 命令

若想替换预训练模型某一层,可以用nn.Sequential对新设计的模块结构进行封装后,对该层直接采用赋值操作。也可以采用给_modules字典赋值的方式。设计的模型一般都继承自nn.Module类,该类有一个成员变量叫做_modules存放了{模块名称 :模块内容} 的键值对。

讯享网

示例代码如下: 


讯享网

 

加载预训练模型文件到内存后,将预训练模型各层列表化后利用列表索引的方式提取相应的网络层。按顺序执行用nn.Sequential,不按顺序执行用nn.ModuleList,具体使用不同参考博文()。

讯享网

 

先设计符合自己目标要求的新模型,将预训练模型权重从官网下载,采用两种方法中的其中一种对预训练权重进行加载操作。

torch.load(path,map_location=‘cpu’)

path指预训练权重文件下载后的路径,map_location指向将权重加载到CPU还是CUDA上。

(1)方法一

讯享网

2.方法二

load_state_dict()函数中的strict默认为True,要求加载的预训练模型权重和新设计模型的状态字典中键值对严格匹配。我们设置strict=False将预训练权重中匹配的键值对进行加载,并将模型中丢失的模块名和在模型中不存在的模块名分别存入missing_keys,unexpected_keys。

 

1.设置冻结参数的requires_grad = False,优化器更新时,参数梯度保持不变。

代码如下(示例):

讯享网

2.设计用于优化器更新参数的列表

(1)一组参数

 

 (2)多组参数,并且每组参数的学习率不同。

讯享网

3.将参数更新列表放置于优化器

代码如下(示例):

 

本文介绍了更改网络模型结构的方法和加载预训练模型权重的两种常用方法以及finetune操作如何快速实现。如果对于模型结构改进和参数训练一筹莫展的你有帮助记得点击小心心呀✌️✌️✌️

小讯
上一篇 2025-06-09 23:54
下一篇 2025-06-15 22:00

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/148064.html