Pytorch固定部分参数(只训练部分层)

Stella981
• 阅读 1140

在迁移学习中我们经常会用到预训练模型,并在预训练模型的基础上添加额外层。训练时先将预训练层参数固定,只训练额外添加的部分。完了之后再全部训练微调。

在pytorch 固定部分参数训练时需要在优化器中施加过滤。

Pytorch固定部分参数(只训练部分层)

需要自己过滤

optimizer.SGD(filter(lambda p: p.requires_grad, model.parameters()), lr=1e-3)

另外,如果是Variable,则可以初始化时指定

j = Variable(torch.randn(5,5), requires_grad=True)

但是如果是(神经网络层)

m = nn.Linear(10,10)

是没有requires_grad传入的,m.requires_grad也没有,需要

for i in m.parameters():
    i.requires_grad=False

另外一个小技巧就是在nn.Module里,可以在中间插入这个

for p in self.parameters():
    p.requires_grad=False

这样前面的参数就是False,而后面的不变

class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.conv1 = nn.Conv2d(1, 6, 5)
        self.conv2 = nn.Conv2d(6, 16, 5)

        for p in self.parameters():
            p.requires_grad=False

        self.fc1 = nn.Linear(16 * 5 * 5, 120)
        self.fc2 = nn.Linear(120, 84)
        self.fc3 = nn.Linear(84, 10)

 1 class RESNET_attention(nn.Module):
 2     def __init__(self, model, pretrained):
 3         super(RESNET_attetnion, self).__init__()
 4         self.resnet = model(pretrained)
 5         for p in self.parameters():
 6             p.requires_grad = False
 7         self.f = nn.Conv2d(2048, 512, 1)
 8         self.g = nn.Conv2d(2048, 512, 1)
 9         self.h = nn.Conv2d(2048, 2048, 1)
10         self.softmax = nn.Softmax(-1)
11         self.gamma = nn.Parameter(torch.FloatTensor([0.0]))
12         self.avgpool = nn.AvgPool2d(7, stride=1)
13         self.resnet.fc = nn.Linear(2048, 10)

note:以上代码复现SAGAN的Attention部分,这不是主要问题

这样就将for循环以上的参数固定, 只训练下面的参数(f,g,h,gamma,fc,等), 但是注意需要在optimizer中添加上这样的一句话filter(lambda p: p.requires_grad, model.parameters()
添加的位置为:
optimizer = optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr=0.0001, betas=(0.9, 0.999), eps=1e-08, weight_decay=1e-5)

原文:

[1] https://blog.csdn.net/guotong1988/article/details/79739775

[2] https://blog.csdn.net/weixin\_34261739/article/details/87555871

点赞
收藏
评论区
推荐文章
GoCoding GoCoding
3年前
TorchVision Faster R-CNN 微调,实战 Kaggle 小麦检测
本文将利用TorchVisionFasterRCNN预训练模型,于Kaggle:全球小麦检测(https://www.kaggle.com/c/globalwheatdetection)🌾上实践迁移学习中的一种常用技术:微调(finetuning)。本文相关的KaggleNotebooks可见:TorchVis
什么是fine-tuning?
什么是finetuning?在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新finetuning(也叫微调),或者当做特征提取器。以下是常见的两类迁移学习场景:1卷积网络当做特征提取器。使用在ImageNet上预训练的网络,去掉最后的全连接层,剩余
Stella981 Stella981
2年前
PaddlePaddle预训练模型大合集,还有官方使用说明书
PaddlePaddle在不断增加官方支持的模型的同时,也在关注预训练模型的丰富度。在过去的版本中,我们已经发布了目标检测FasterRCNN、MobileNetSSD、PyramidBox和场景文字识别CRNNCTC、OCRAttention共计5个预训练模型。近期,在图像分类领域我们一口气发布了四个系列共十个预训练模型,丰富扩充了预训练模
Wesley13 Wesley13
2年前
##好好好####BERT meet Knowledge Graph:预训练模型与知识图谱相结合的研究进展
随着BERT等预训练模型横空出世,NLP方向迎来了一波革命,预训练模型在各类任务上均取得了惊人的成绩。随着各类预训练任务层出不穷,也有部分研究者考虑如何在BERT这一类模型中引入或者强化知识图谱中包含的信息,进而增强BERT对背景知识或常识信息的编码能力。本文主要关注于如何在BERT中引入知识图谱中信息,并survey了目前已公布的若干种方法,欢迎大家批评和
Wesley13 Wesley13
2年前
4项探索+4项实践,带你了解华为云视觉预训练研发技术
摘要:本文主要讲述云原生时代华为云在AI基础研究、视觉预训练模型研发和行业实践,以及AI开发平台ModelArts的最新进展。近日,在Qcon全球软件开发大会(深圳站)上,华为云人工智能领域首席科学家、IEEEFELLOW田奇博士,发表了“云原生时代,视觉预训练大模型探索与实践”的主题演讲,介绍了云原生时代华为云在AI基础研究、视觉预训练模
京东云开发者 京东云开发者
5个月前
DeepSpeed: 大模型训练框架 | 京东云技术团队
目前,大模型的发展已经非常火热,关于大模型的训练、微调也是各个公司重点关注方向。但是大模型训练的痛点是模型参数过大,动辄上百亿,如果单靠单个GPU来完成训练基本不可能。所以需要多卡或者分布式训练来完成这项工作。
高耸入云 高耸入云
3个月前
成为AI大模型工程师/产品经理,成就丰盛人生
500多名学员正在参加近屿智能OJAC举办的第五期AIGC星辰大海:大模型工程师和产品专家深度训练营。AIGC星辰大海:大模型工程师和产品专家深度训练营秉持“实战导向,项目驱动”的教学理念,从预训练、数据清洗、数据标注、微调大模型到增量预训练以及开发软硬件
高耸入云 高耸入云
2个月前
如何做Bert模型的fine-tuning?近屿智能OJAC带你一探究竟
📖更多AI资讯请👉🏾选择合适的预训练模型:从预训练的BERT模型开始,例如Google提供的BERTbase或BERTlarge。这些模型已经在大量文本数据上进行过预训练了,我们如何对BERT模型进行finetuning呢?准备和预处理数据:集针对特
灵吉菩萨 灵吉菩萨
4天前
AI人人必修-提示词工程+大模型多场景实战(超清完结)
由于大语言模型的训练需要巨大的计算资源,通常不可能多次迭代大语言模型预训练。千亿级参数量的大语言模型每次预训练的计算需要花费数百万元人民币。因此,在训练大语言模型之前,构建一个准备充分的预训练语料库尤为重要。download:kuxueit.cn/9291