应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

Pytorch人工智能AI大模型微调代码示例!

  随着深度学习的发展,在大模型的训练上都是在一些较大数据集上进行训练的,比如Imagenet1k,Imagenet11k,甚至是ImageNet21k等。但我们在实际应用中,我们自己的数据集可能比较小,只有几千张照片,这时从头训练具有几千万参数的大型神经网络是不现实的,因为越大的模型对数据量的要求越高,过拟合无法避免。
  因为适用于ImageNet数据集的复杂模型,在一些小的数据集上可能会过拟合,同时因为数据量有限,最终训练得到的模型的精度也可能达不到实用要求。
  解决上述问题的方法:
  收集更多数据集,当然这对于研究成本会大大增加
  应用迁移学习(transferlearning):从源数据集中学到知识迁移到目标数据集上。
  1、模型微调(finetune)
  微调(finetune)通过使用在大数据上得到的预训练好的模型来初始化自己的模型权重,从而提升精度。这就要求预训练模型质量要有保证。微调通常速度更快、精度更高。当然,自己训练好的模型也可以当做预训练模型,然后再在自己的数据集上进行训练,来使模型适用于自己的场景、自己的任务。
  先引入迁移学习(TransferLearning)的概念:
  当我们训练好了一个模型之后,如果想应用到其他任务中,可以在这个模型的基础上进行训练,来作微调网络。这也是迁移学习的概念,可以节省训练的资源以及训练的时间。
  迁移学习的一大应用场景就是模型微调,简单的来说就是把在别人训练好的基础上,换成自己的数据集继续训练,来调整参数。Pytorch中提供很多预训练模型,学习如何进行模型微调,可以大大提升自己任务的质量和速度。
  假设我们要识别的图片类别是椅子,尽管ImageNet数据集中的大多数图像与椅子无关,但在ImageNet数据集上训练的模型可能会提取更通用的图像特征,这有助于识别边缘、纹理、形状和对象组合。这些类似的特征对于识别椅子也可能同样有效。
  2。1、为什么要微调
  因为预训练模型用了大量数据做训练,已经具备了提取浅层基础特征和深层抽象特征的能力。
  对于图片来说,我们CNN的前几层学习到的都是低级的特征,比如,点、线、面,这些低级的特征对于任何图片来说都是可以抽象出来的,所以我们将他作为通用数据,只微调这些低级特征组合起来的高级特征即可,例如,这些点、线、面,组成的是园还是椭圆,还是正方形,这些代表的含义是我们需要后面训练出来的。
  如果我们自己的数据不够多,泛化性不够强,那么可能存在模型不收敛,准确率低,模型泛化能力差,过拟合等问题,所以这时就需要使用预训练模型来做微调了。注意的是,进行微调时,应该使用较小的学习率。因为预训练模型的权重相对于随机初始化的权重来说已经很不错了,所以不希望使用太大的学习率来破坏原本的权重。通常用于微调的初始学习率会比从头开始训练的学习率小10倍。
  总结:对于不同的层可以设置不同的学习率,一般情况下建议,对于使用的原始数据做初始化的层设置的学习率要小于(一般可设置小于10倍)初始化的学习率,这样保证对于已经初始化的数据不会扭曲的过快,而使用初始化学习率的新层可以快速的收敛。
  2。2、需要微调的情况
  其中微调的方法又要根据自身数据集和预训练模型数据集的相似程度,以及自己数据集的大小来抉择。
  不同情况下的微调:
  数据少,数据类似程度高:可以只修改最后几层或者最后一层进行微调。
  数据少,数据类似程度低:冻结预训练模型的前几层,训练剩余的层。因为数据集之间的相似度较低,所以根据自身的数据集对较高层进行重新训练会比较有效。
  数据多,数据类似程度高:这是最理想的情况。使用预训练的权重来初始化模型,然后重新训练整个模型。这也是最简单的微调方式,因为不涉及修改、冻结模型的层。
  数据多,数据类似程度低:微调的效果估计不好,可以考虑直接重新训练整个模型。如果你用的预训练模型的数据集是ImageNet,而你要做的是文字识别,那么预训练模型自然不会起到太大作用,因为它们的场景特征相差太大了。
  注意:
  如果自己的模型中有fc层,则新数据集的大小一定要与原始数据集相同,比如CNN中输入的图片大小一定要相同,才不会报错。
  如果包含fc层但是数据集大小不同的话,可以在最后的fc层之前添加卷积或者pool层,使得最后的输出与fc层一致,但这样会导致准确度大幅下降,所以不建议这样做
  2。3、模型微调的流程
  微调的步骤有很多,看你自身数据和计算资源的情况而定。虽然各有不同,但是总体的流程大同小异。
  步骤示例1:
  1、在源数据集(如ImageNet数据集)上预训练一个神经网络模型,即源模型。
  2、创建一个新的神经网络模型,即目标模型。它复制了源模型上除了输出层外的所有模型设计及其参数。
  我们假设这些模型参数包含了源数据集上学习到的知识,且这些知识同样适用于目标数据集。
  我们还假设源模型的输出层跟源数据集的标签紧密相关,因此在目标模型中不予采用。
  3、为目标模型添加一个输出大小为目标数据集类别个数的输出层,并随机初始化该层的模型参数。
  4、在目标数据集(如椅子数据集)上训练目标模型。可以从头训练输出层,而其余层的参数都是基于源模型的参数微调得到的。
  步骤示例2:
  在已经训练好的网络上进行修改;
  冻结网络的原来那一部分;
  训练新添加的部分;
  解冻原来网络的部分层;
  联合训练解冻的层和新添加的部分。
  2。4、参数冻结指定训练模型的部分层
  我们所提到的冻结模型、冻结部分层,其实归根结底都是对参数进行冻结。冻结训练可以加快训练速度。在这里,有两种方式:全程冻结与非全程冻结。
  非全程冻结比全程冻结多了一个步骤:解冻,因此这里就讲解非全程冻结。看完非全程冻结之后,就明白全程冻结是如何进行的了。
  非全程冻结训练分为两个阶段,分别是冻结阶段和解冻阶段。当处于冻结阶段时,被冻结的参数就不会被更新,在这个阶段,可以看做是全程冻结;而处于解冻阶段时,就和普通的训练一样了,所有参数都会被更新。
  当进行冻结训练时,占用的显存较小,因为仅对部分网络进行微调。如果计算资源不够,也可以通过冻结训练的方式来减少训练时资源的占用。
  因为一般需要保留FeaturesExtractor的结构和参数,提出了两种训练方法:
  固定预训练的参数:requiresgradFalse或者lr0,即不更新参数;
  将FeaturesExtractor部分设置很小的学习率,这里用到参数组(paramsgroup)的概念,分组设置优化器的参数。
  2。5、参数冻结的方式
  我们经常提到的模型,就是一个可遍历的字典。既然是字典,又是可遍历的,那么就有两种方式进行索引:一是通过数字,二是通过名字。
  其实使用冻结很简单,没有太高深的魔法,只用设置模型的参数requiresgrad为False就可以了。
  2。5。1、冻结方式1
  在默认情况下,参数的属性。requiresgradTrue,如果我们从头开始训练或微调不需要注意这里。但如果我们正在提取特征并且只想为新初始化的层计算梯度,其他参数不进行改变。那我们就需要通过设置requiresgradFalse来冻结部分层。在PyTorch官方中提供了这样一个例程。
  defsetparameterrequiresgrad(model,featureextracting):
  iffeatureextracting:
  forparaminmodel。parameters():
  param。requiresgradFalse
  在下面我们使用resnet18为例的将1000类改为4类,但是仅改变最后一层的模型参数,不改变特征提取的模型参数;
  注意我们先冻结模型参数的梯度;
  再对模型输出部分的全连接层进行修改,这样修改后的全连接层的参数就是可计算梯度的。
  在训练过程中,model仍会进行梯度回传,但是参数更新则只会发生在fc层。通过设定参数的requiresgrad属性,我们完成了指定训练模型的特定层的目标,这对实现模型微调非常重要。
  importtorchvision。modelsasmodels
  冻结参数的梯度
  featureextractTrue
  modelmodels。resnet18(pretrainedTrue)
  setparameterrequiresgrad(model,featureextract)
  修改模型,输出通道4,此时,fc层就被随机初始化了,但是其他层依然保存着预训练得到的参数。
  model。fcnn。Linear(infeatures512,outfeatures4,biasTrue)
  我们直接拿torchvision。models。resnet50模型微调,首先冻结预训练模型中的所有参数,然后替换掉最后两层的网络(替换2层池化层,还有fc层改为dropout,正则,线性,激活等部分),最后返回模型:
  8更改池化层
  classAdaptiveConcatPool2d(nn。Module):
  definit(self,sizeNone):
  super()。init()
  sizesizeor(1,1)池化层的卷积核大小,默认值为(1,1)
  self。poolonenn。AdaptiveAvgPool2d(size)池化层1
  self。pooltwonn。AdaptiveAvgPool2d(size)池化层2
  defforward(self,x):
  returntorch。cat(〔self。poolone(x),self。pooltwo(x),1〕)连接两个池化层
  7迁移学习:拿到一个成熟的模型,进行模型微调
  defgetmodel():
  modelpremodels。resnet50(pretrainedTrue)获取预训练模型
  冻结预训练模型中所有的参数
  forparaminmodelpre。parameters():
  param。requiresgradFalse
  微调模型:替换ResNet最后的两层网络,返回一个新的模型
  modelpre。avgpoolAdaptiveConcatPool2d()池化层替换
  modelpre。fcnn。Sequential(
  nn。Flatten(),所有维度拉平
  nn。BatchNorm1d(4096),256x6x64096
  nn。Dropout(0。5),丢掉一些神经元
  nn。Linear(4096,512),线性层的处理
  nn。ReLU(),激活层
  nn。BatchNorm1d(512),正则化处理
  nn。Linear(512,2),
  nn。LogSoftmax(dim1),损失函数
  )
  return
  2。5。2、冻结方式2
  因为ImageNet有1000个类别,所以提供的ImageNet预训练模型也是1000分类。如果我需要训练一个10分类模型,理论上来说只需要修改最后一层的全连接层即可。
  如果前面的参数不冻结就表示所有特征提取的层会使用预训练模型的参数来进行参数初始化,而最后一层的参数还是保持某种初始化的方式来进行初始化。
  在模型中,每一层的参数前面都有前缀,比如conv1、conv2、fc3、backbone等等,我们可以通过这个前缀来进行判断,也就是通过名字来判断,如:ifbackboneinparam。name,最终选择需要冻结与不需要冻结的层。最后需要将训练的参数传入优化器进行配置。
  iffreezelayers:
  forname,paraminmodel。namedparameters():
  除最后的全连接层外,其他权重全部冻结
  iffcnotinname:
  param。requiresgrad(False)
  pg〔pforpinmodel。parameters()ifp。requiresgrad〕
  optimizeroptim。SGD(pg,lr0。01,momentum0。9,weightdecay4E5)
  或者判断该参数位于模型的哪些模块层中,如paraminmodel。backbone。parameters(),然后对于该模块层的全部参数进行批量设置,将requiresgrad置为False。
  ifFreezeTrain:
  forparaminmodel。backbone。parameters():
  param。requiresgradFalse
  2。5。2、冻结方式3
  通过数字来遍历模型中的层的参数,冻结所指定的若干个参数,这种方式用的少
  count0
  forlayerinmodel。children():
  countcount1
  ifcount10:
  forparaminlayer。parameters():
  param。requiresgradFalse
  然后将需要训练的参数传入优化器,也就是过滤掉被冻结的参数。
  optimizertorch。optim。Adam(filter(lambdap:p。requiresgrad,model。parameters()),lrLR)
  2。6、修改模型参数
  前面说道,冻结模型就是冻结参数,那么这里的修改模型参数更多的是修改模型参数的名称。
  值得一提的是,由于训练方式(单卡、多卡训练)、模型定义的方式不同,参数的名称也会有所区别,但是此时模型的结构是一样的,依旧可以加载预训练模型。不过却无法直接载入预训练模型的参数,因为名称不同,会出现KeyError的错误,所以载入前可能需要修改参数的名称。
  比如说,使用多卡训练时,保存的时候每个参数前面多会多出module。这几个字符,那么当使用单卡载入时,可能就会报错了。
  通过以下方式,就可以使用conv1来替代module。conv1这个key的方式来将更新后的key和原来的value相匹配,再载入自己定义的模型中。
  modeldictpretrainedmodel。statedict()
  pretraineddict{k:vfork,vinpretraineddict。items()ifk〔7:〕inmodeldict}
  modeldict。update(pretraineddict)
  2。7、修改模型结构
  importtorch。nnasnn
  importtorch
  classAlexNet(nn。Module):
  definit(self):
  super(AlexNet,self)。init()
  self。featuresnn。Sequential(
  nn。Conv2d(3,64,kernelsize11,stride4,padding2),使用卷积层,输入为3,输出为64,核大小为11,步长为4
  nn。ReLU(inplaceTrue),使用激活函数
  nn。MaxPool2d(kernelsize3,stride2),使用最大池化,这里的大小为3,步长为2
  nn。Conv2d(64,192,kernelsize5,padding2),使用卷积层,输入为64,输出为192,核大小为5,步长为2
  nn。ReLU(inplaceTrue),使用激活函数
  nn。MaxPool2d(kernelsize3,stride2),使用最大池化,这里的大小为3,步长为2
  nn。Conv2d(192,384,kernelsize3,padding1),使用卷积层,输入为192,输出为384,核大小为3,步长为1
  nn。ReLU(inplaceTrue),使用激活函数
  nn。Conv2d(384,256,kernelsize3,padding1),使用卷积层,输入为384,输出为256,核大小为3,步长为1
  nn。ReLU(inplaceTrue),使用激活函数
  nn。Conv2d(256,256,kernelsize3,padding1),使用卷积层,输入为256,输出为256,核大小为3,步长为1
  nn。ReLU(inplaceTrue),使用激活函数
  nn。MaxPool2d(kernelsize3,stride2),使用最大池化,这里的大小为3,步长为2
  )
  self。avgpoolnn。AdaptiveAvgPool2d((6,6))
  self。classifiernn。Sequential(
  nn。Dropout(),使用Dropout来减缓过拟合
  nn。Linear(25666,4096),全连接,输出为4096
  nn。ReLU(inplaceTrue),使用激活函数
  nn。Dropout(),使用Dropout来减缓过拟合
  nn。Linear(4096,4096),维度不变,因为后面引入了激活函数,从而引入非线性
  nn。ReLU(inplaceTrue),使用激活函数
  nn。Linear(4096,1000),ImageNet默认为1000个类别,所以这里进行1000个类别分类
  )
  defforward(self,x):
  xself。features(x)
  xself。avgpool(x)
  xtorch。flatten(x,1)
  xself。classifier(x)
  returnx
  defalexnet(numclasses,device,pretrainedweights):
  netAlexNet()定义AlexNet
  ifpretrainedweights:判断预训练模型路径是否为空,如果不为空则加载
  net。loadstatedict(torch。load(pretrainedweights,maplocationdevice))
  numfcnet。classifier〔6〕。infeatures获取输入到全连接层的输入维度信息
  net。classifier〔6〕torch。nn。Linear(infeaturesnumfc,outfeaturesnumclasses)根据数据集的类别数来指定最后输出的outfeatures数目
  returnnet
  在上述代码中,我是先将权重载入全部网络结构中。此时,模型的最后一层大小并不是我想要的,因此我获取了输入到最后一层全连接层之前的维度大小,然后根据数据集的类别数来指定最后输出的outfeatures数目,以此代替原来的全连接层。
  你也可以先定义好具有指定全连接大小的网络结构,然后除了最后一层全连接层之外,全部层都载入预训练模型;你也可以先将权重载入全部网络结构中,然后删掉最后一层全连接层,最后再加入一层指定大小的全连接层

逼本泽马离队?皇马将引进弗拉霍维奇,23岁的亿元替补真的合适虽然说皇马的阵容当中拥有维尼修斯、罗德里戈和巴尔韦德等一众有天赋的球员,而且在本赛季都有非常出色的发挥,但是目前皇马的头号射手依然是本泽马。35岁的法国老将虽然本赛季遭遇了伤病……分布式一致性Raft算法日志复制第2部分日志复制介绍Raft是一种共识算法,旨在以分布式方式编排副本。Raft在设计时考虑了可理解性,只有几个活动部件并且易于实施。在上一篇文章中,我讲了Raft的基础知……五一假期,出境游或大爆发!热门目的地是来源:央视财经出境游的恢复,让越来越多的游客开始规划自己接下来的出境行程。清明、五一两个假期成为目前咨询量最高的出境游团期,五一假期的出境游产品尤为火爆。元宵节过后……这个苗寨外号短裙苗,女子的超短裙仅有5寸长,吸引大批游客一次偶然的机会来到了贵州、去了新桥苗寨,这里的姑娘竟然只穿5寸长的短裙。(此处已添加小程序,请到今日头条客户端查看)正是由于如此特别的穿衣打扮风格,终于明白这里为什么被称……回顾2022年关于丰网快递的那些事儿快递业是我国经济社会发展和消费活力的晴雨表。2021年,全国快递业务收入达到10332。3亿元,首次突破万亿元。2022年业务收入完成1。06万亿元,同比增长2。3。而快递行业……杭州有条空中长廊叫白蛇飞渡桥?西湖边这个公园隐秘又浪漫,随手白蛇传、梁祝传说在流传千年的爱情传说里,蕴藏着杭州独特的浪漫气质。你是否知道,杭州有座空中长廊叫白蛇飞渡桥,万松书院不仅仅是个爱情文化地标。跟着杭小微一起,探寻西湖边的秘密和故……手机QQ服务疑似故障,消息无法发出及接收2月10日消息,在今日上午11时左右,手机QQ服务疑似出现故障,用户在手机端无法发送信息后,会一直出现转圈状态,内容无法发出。除了内容无法发出以外,QQ手机端也无法接收消息。……国米本轮赢球触发强制买断条款,确定1000万欧买断阿斯拉尼今天凌晨国米在米兰德比战中10战胜米兰,这场胜利也触发了中场阿斯拉尼的强制买断条款,国米需要支付1000万欧元将其买断。去年夏天国米以先租后买的方式从恩波利签下了年轻中场……暗物质与暗能量的科幻故事分享有趣的科幻故事,探讨奇妙的科幻素材,大家好,我是四号判官,今天带给大家的是暗物质和暗能量相关的科幻故事素材。浅显的文明,短暂的发展,能突破掌握到的宇宙真理,注定是少之……个股分析光迅科技东港股份川大智胜美利云光迅科技公司亮点:主要从事光通信领域内光电子器件的开发及制造公司是专业从事光电子器件及子系统产品研发、产销及技术服务的公司,是全球领先的光电子器件、子系统解决方案供……出境团队游重启出境旅游市场加速复苏2月6日,中国游客抵达曼谷廊曼国际机场。新华社发据新华社北京电(记者陈爱平、罗鑫、周文冲)6日,我国试点恢复赴泰国等20个国家出境团队旅游和机票酒店业务。业内人士预计,我……阳春面何以得名众所周知,阳春面是上海人对不放浇头的光面的委婉说法。可为什么会这么说呢?搜检网络,有人说它是阳春白雪的略语,似并不可靠。问过几位经常吃面,且善于发现好吃面馆的朋友,其中一……
WTT世界杯决赛,陈梦必须一赢到底头条创作挑战赛10月27日,新乡WTT世界杯决赛即将开打,对陈梦来说,这是一场必须一赢到底的战役。第一轮:陈梦迎战袁嘉楠WTT澳门冠军赛上,袁嘉楠一战成名,令……F1墨西哥大奖赛前瞻全年最高的比赛,维斯塔潘期待新纪录再次回到罗德里格斯兄弟赛道,没有了去年冠军争夺的剑拔弩张,当重要的悬念都已经尘埃落定,我们有机会安心欣赏这场全年最高的比赛。在缤纷艳丽的墨西哥城,我们一起期待一场精彩纷呈……夸父升空与羲和共同逐日,中国初步建立综合性太阳观测网去年发射的羲和号可以称为我国探日工程的探路者,而夸父一号则是观察太阳的多面手,它可以从紫外线、可见光和X射线波段等对太阳进行观测。我国发射的两颗探日卫星各有侧重,将共同提升我国……甄嬛传难怪眉庄从不质疑甄嬛的双生子,你看她在甘露寺发现了啥在《甄嬛传》中,观众总以为甄嬛才是最后的赢家,实际上她这一路走来失去了太多太多至亲至爱,亲如姐妹的沈眉庄被陷害致死,此生挚爱果郡王为保全她与一对双生子服毒自尽在这场没有硝烟的宫……张纪中的倔强,自己选的老婆,含泪也要走下去年过七旬的白发导演张纪中,近些年一直不是以作品出圈的。几乎每次有张纪中的消息传出来,都是和他的妻子们有关系。先是前几年张纪中和第二任妻子大打出手,最后不欢而散。……马斯克发出警世恒言此时购买新的汽油车是愚蠢的此时购买新的汽油车是愚蠢的!马斯克发出警世恒言!不过,愚蠢者大有人在,誓将愚蠢进行到底者也不乏其人!因为那辆汽油车的剩余价值将非常低,马斯克苦口婆心道!特斯拉披露了第三季……小米12Pro天玑版对比一加10Pro,选谁更好?2022年的双十一,让我有一种比较容易捡漏的感觉,就像本文提到的这两款手机:12256的小米12Pro天玑版,从原价4499跌成3299;同样是12256的一加10Pro,从原……金利来突围中国商报(记者贾欣然)金利来,男人的世界。这句曾红极一时的广告语相信绝大部分国人都耳熟能详,金利来品牌也成为当年众多男士心中时髦的象征。然而,随着年代的更迭,这个2……王诗龄近况!在英国豪宅过13岁生日只有妈妈陪,穿T恤又瘦又美王诗龄如今可是逆袭成了妥妥的小美女,身材瘦下来之后,脸型和五官也越来越像李湘年轻时候的样子了,而不久前正好是王诗龄13岁的生日,因为在英国读书,所以今年的生日似乎只有李湘给她庆……真我GT2大师探索版性价比超高,前辈旗舰价格感人命运悲惨成弃在X7的加持下真我GT2大师探索版实现了DC调光的护眼黑科技,低亮度场景下频闪更低,但在开发者模式下隐藏,切换有点麻烦。图像方面,真我GT2大师探索版采用后置三摄像头设计,配备……蔡斌是未来二十年内中国女排本土主帅首选!我们必须接受此现实中国女排完败于意大利,原因无它:从世界女排联赛首轮开始就一成不变的战术,早让对手研究透了。一旦实力相当,自然而然对手就可以破防取胜!中国女排此次赛事前后两场球共与意大利女排大战……秦卫东从辽宁电视台门岗到著名演员,他对两任前妻有愧秦卫东秦卫东这个演员可能有些观众没听说过,但是如果让爱看小品的观众看到这张脸,一定倍感熟悉。身高192,胖乎乎的长脸,演员秦卫东经常出现在辽宁卫视的小品节目里,是一……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网