预训练模型微调(Fine-tuning pre_trained model)

本文详细介绍了如何在深度学习模型设计中添加、删除和修改网络层,以及如何利用预训练模型权重。通过两种方法加载预训练权重,并讨论了在新模型中冻结部分权重进行finetune的操作。重点是模型结构的灵活性和权重复用策略。

引 言

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

目 录

 一.模型设计

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

2.替换网络层

3.提取网络层

4.构建自定义模型

二、预训练模型权重加载

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

四、总 结


 一.模型设计

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

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

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

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

pretrain_model = models.vgg19(pretrained=True)
pretrain_model.features.add_module('bn',nn.BatchNorm2d(512))

显示网络结构:

    (34): Conv2d(512, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
    (35): ReLU(inplace=True)
    (36): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
    (bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
  )

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

2.替换网络层

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

self._modules[name] = module

示例代码如下: 

vgg19 = torchvision.models.vgg19(pretrained=True)
fc_nums = vgg19.classifier[6].in_features

#(1)直接赋值
vgg19.classifier[6]=nn.Sequential(nn.Linear(fc_nums,5),nn.Softmax(dim=-1))    

#(2)对_modules字典赋值
vgg19.classifier._module
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值