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

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

被折叠的 条评论
为什么被折叠?



