引 言
在设计新模型的时候,尤其在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操作如何快速实现。如果对于模型结构改进和参数训练一筹莫展的你有帮助记得点击小心心呀✌️✌️✌️
到此这篇预训练模型怎么微调(预训练模型 微调)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/hd-wfwjg/20489.html