当前位置:   article > 正文

迁移学习、载入预训练权重和冻结权重_使用迁移学习的方法加载预训练权重_怎么样加载预训练权重

怎么样加载预训练权重

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上运维知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注运维)
img

正文

载入别人预训练权重的时候,由于别人的数据预处理的方式与我们自己的可能不同、全连接层中最后分类的结点个数和你的数据集类别个数不同等情况,都会产生各种报错,我就说一下我会的方法,后面有会进行补充哒。

net = MobileNetV2(class_nums=5)
pre_weights = torch.load(pre_trained_pth)  //(字典文件)这里载入别人训练好的预训练权重,此时只是导入内存中,还没加载到我们的网络中

  • 1
  • 2
  • 3

下面的两种方法都是:载入预训练权重后,删除全连接层的参数
好处就是:在创建网络的时候,可以直接根据我们自己的数据集类别个数更改模型中最后一个全连接节点个数。

//方法一:
pre_dict = {k: v for k, v in pre_weights.items() if "fc" not in k}
//
//方法二:
//这里的想法是:拿出预训练权重(字典)的key和value,通过获取我们自己网络中与预训练权重中网络层名称一样的的层,拿到相同个数的网络层,删除不一致的
pre_dict = {k: v for k, v in pre_weights.items() if net.state_dict()[k].numel() == v.numel()}

missing_keys, unexpected_keys = net.load_state_dict(pre_dict, strict=False)  //将特征提取层的权重送进网络,这里的strict设置为False后,就不用预训练权重的网络结构和我们自己的网络完全key值一致

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

而第三种方法,在创建网络时候,更改最后的全连接层节点个数,直接net.load_state_dict()方法载入会报错的

net = MobileNetV2()
net.load_state_dict(torch.load(pre_trained_pth), strict=False)
//方法三:
in_channel = net.fc.in_feacture
net.fc = nn.Linear(in_channel, 5)  //这里为什么是.fc,道理同下,下面具体讲解了

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

这里另外说一下为什么删除预训练权重中全连接层的参数,上方代码的判断语句中必须是“fc”???
其实不然,取决于你搭建网络时类变量名称的定义,可以通过来查看每个网络层的名称:

net = MobileNetV2(class_nums=5)
print(net)
//或者
for name in net.named_modules():
	print(name)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

在这里插入图片描述

例如:上面的红框中网络的全连接层名称是classifier,那么我们在删除全连接层的参数的时候就是if “classifier” not in k。
或者把网络结构中的classifier改成fc。这里全连接层的名称完全取决于我们自己。

在这里插入图片描述

2.载入预训练权重后两种情况

特征层的权重参数在反向传播过程中会求导,冻结特征层,可以缩短训练时间。

2.1冻结全部的特征提取层,微调全连接层

我们如果想要在短时间内将我们的模型达到一个相对理想的效果,可以将特征层全部冻结(全部使用别人预训练权重),然后只训练全连接层,根据我们自己的数据集类别进行fine-tuning。

for param in net.parameters():  //这里的就遍历每个特征层上的权重参数了
    param.requires_grad = False

  • 1
  • 2
  • 3

2.2冻结部分的特征层

最后的话

最近很多小伙伴找我要Linux学习资料,于是我翻箱倒柜,整理了一些优质资源,涵盖视频、电子书、PPT等共享给大家!

资料预览

给大家整理的视频资料:

给大家整理的电子书资料:

如果本文对你有帮助,欢迎点赞、收藏、转发给朋友,让我有持续创作的动力!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注运维)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
中…(img-MrVVQF7B-1713660466452)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号