在pytorch微调mobilenetV3模型时遇到的问题
1.KeyError: ‘features.4.block.2.fc1.weight’
这个是因为模型结构修改了,没有正确修改预训练权重,导致载入权重与模型不同,使用下面说的两种方法适当修改载入权重即可。
2.size mismatch for fc.weight: copying a param with shape torch.Size([1000, 1280]) from checkpoint, the shape in current model is torch.Size([4, 1280]).
size mismatch for fc.bias: copying a param with shape torch.Size([1000]) from checkpoint, the shape in current model is torch.Size([4]).
下载的预训练模型中的全连接层是1000类别的,而本人的类别只有4类,所以会报不匹配的错误。

因此我就学习了PyTorch载入预训练权重方法
方法一 :自称为万能法,直接删掉分类层,直接避免最后全连接层权重不匹配问题。

net = MobileNetV3(num_class=4)
net_weights = net.state_dict()
model_weights_path = "model/mobilenet_v3.pth"
pre_weights = torch.load(model_weights_path)
# delete classifier weights
# 这种方法主要是遍历字典,.pth文件(权重文件)的本质就是字典的存储
# 通过改变我们载入的权重的键值对,可以和当前的网络进行配对的
# 这里举到的例子是对"classifier"结构层的键值对剔除,或者说是不载入该模块的训练权重,这里的"classifier"结构层就是最后一部分分类层
pre_dict = {k: v for k, v in pre_weights.items() if "classifier" not in k}
# 如果修改了载入权重或载入权重的结构和当前模型的结构不完全相同,需要加strict=False,保证能够权重载入
net.load_state_dict(pre_dict, strict=False)
net.to(device)

方法二 :进行两种权重对比,会减少问题存在,但有的时候还是会出现问题。

# 另一种方法会直接两种权重对比,直接两种方法对比,减少问题的存在
net = MobileNetV3(num_class=4)
net_weights = net.state_dict()
model_weights_path = "model/mobilenet_v3.pth"
pre_weights = torch.load(model_weights_path)
# 通过改变我们载入的权重的键值对,可以和当前的网络进行配对的
pre_dict = {k: v for k, v in pre_weight.items() if net_weights[k].numel() == v.numel()}
# 在下载的官方预训练参数中,num_classes=1000 而在我们的model中num_classes=4
#net.state_dict()[k].numel(): 提取model模型中的关键字K代表的层的长度
#v.numel: 是下载的预训练参数中对应层的长度
# 如果修改了载入权重或载入权重的结构和当前模型的结构不完全相同,需要加strict=False,保证能够权重载入
net.load_state_dict(pre_dict, strict=False)
net.to(device)

利用方法一解决自己权重不匹配问题,最后载入预训练模型和冻结特征权重完整代码如下所示:

# create modelnet = mobilenet_v6_large(num_classes=4)# load pretrain weights 加载一个预训练模型,收敛很快model_weight_path = "model/mobilenet_v3.pth" #后期可以使用自己数据集的训练权重作为预训练模型,当为老师,实现半监督(知识蒸馏)#断言判断pth文件在不在assert os.path.exists(model_weight_path), "file {} dose not exist.".format(model_weight_path)pre_weights = torch.load(model_weight_path, map_location=device)# 这里是对"classifier"结构层的键值对剔除,简单理解就是不载入该模块的训练权重pre_dict = {k: v for k, v in pre_weights.items() if "classifier" not in k}missing_keys, unexpected_keys = net.load_state_dict(pre_dict, strict=False)# freeze features weights  #冻结特征权重for param in net.features.parameters():# param.requires_grad = True  #一起训练param.requires_grad = False   #迁移学习,固定他的特征提取层,优化他的全连接分类层net.to(device)# 可以指定CPU或者GPU,和cuda()区别是cuda()只能指定GPU

学习笔记26-解决:载入预训练模型时Pytorch遇到权重不匹配的问题(附+修改后的预训练模型载入和冻结特征权重完整代码)相关推荐

  1. Dlib学习笔记:解决dlib array2d转 OpenCV Mat时颜色失真

    Dlib学习笔记:解决dlib array2d转 OpenCV Mat时颜色失真 [尊重原创,转载请注明出处] http://blog.csdn.net/guyuealian/article/deta ...

  2. python学习笔记26(python中__name__的使用)

    python学习笔记26(python中__name__的使用) 在python中,每个py文件都是一个模块,也都是一个可执行文件,即包含main方法.因此,对每个py文件,可以单独运行,也可以imp ...

  3. 深度学习笔记其六:现代卷积神经网络和PYTORCH

    深度学习笔记其六:现代卷积神经网络和PYTORCH 1. 深度卷积神经网络(AlexNet) 1.1 学习表征 1.1 缺少的成分:数据 1.2 缺少的成分:硬件 1.2 AlexNet 1.2.1 ...

  4. 论文学习笔记: Learning Multi-Scale Photo Exposure Correction(含pytorch代码复现)

    论文学习笔记: Learning Multi-Scale Photo Exposure Correction--含pytorch代码复现 本章工作: 论文摘要 训练数据集 网络设计原理 补充知识:拉普 ...

  5. SSM框架下对信息执行修改操作时的信息弹窗回显以及对信息修改后对数据库的更新问题

    SSM框架下对信息执行修改操作时的信息弹窗回显以及对信息修改后的同步问题 概括 主要说一下前端的实现 概括 今天在做实训作业时,有个对数据信息进行修改的操作,要求点击修改按钮后弹出修改框,栏目中需要显 ...

  6. python __name__怎么使用_python学习笔记26(python中__name__的使用)

    在python中,每个py文件都是一个模块,也都是一个可执行文件,即包含main方法.因此,对每个py文件,可以单独运行,也可以import它给其他客户使用,这两种情况不一样. 1. 如果模块是被导入 ...

  7. Android学习笔记26:图片切换控件ImageSwitcher的使用

    在Windows操作系统中,要查看多张图片,可以通过使用"Windows照片查看器"在"上一张"和"下一张"之间切换,进行多张图片的浏览. ...

  8. SilverLight学习笔记--如何解决Button不响应MouseLeftButtonDown与MouseLeftButtonUp事件的问题...

    在Silverlight 2 中的按钮不能响应MouseLeftButtonDown 和 MouseLeftButtonUp 事件,为解决此问题,我们可通过创建自定义按钮控件加以解决, 1.创建自定义 ...

  9. Go 学习笔记(44)— Go 标准库之 os(获取文件状态、获取/修改文件权限、创建、删除目录和文件、获取进程ID、设置获取环境变量)

    1. 概述 os 包提供了操作系统函数的不依赖平台的接口.失败的调用会返回错误值而非错误码.通常错误值里包含更多信息.例如,如果某个使用一个文件名的调用(如Open.Stat)失败了,打印错误时会包含 ...

最新文章

  1. PHP服务器时间差8小时解决方案
  2. scrapy笔记——python的时间转换
  3. .net core 使用redis 基于 StackExchange.Redis
  4. 7-Zip CommondLine 使用记录
  5. LintCode 16. 带重复元素的排列
  6. c++中RTTI的观念和使用
  7. Linux常用命令之yum
  8. Opencv之读取yuv420P
  9. TCP新手误区–心跳的意义
  10. itop 导入AD用户
  11. Adobe软件字体导入无法显示的问题
  12. MAC常用命令和常用软件列表
  13. 如何root安卓手机_2019年安卓手机一键root教程,附科普安卓为何root困难?
  14. 判断是否为Debug模式
  15. macbook有什么好用的软件吗?macbook上好用的软件推荐
  16. kotlin 使用ButterKnife
  17. codeup之沙漏图形
  18. 湖南hp服务器虚拟化解决方案,HP刀片服务器虚拟化整合解决方案.doc
  19. 蓝牙防丢器实现安卓的BLE接口编程
  20. qmake手册(初级部分)

热门文章

  1. 获取office序列号并删除
  2. csp 201609-3 炉石传说
  3. 机器学习(Dog vs Cat)猫狗大战
  4. 论打击的本质(2)-视觉理论及应用篇
  5. 立创EDA完整器件+封装+3D提取
  6. 分享一个随机更改 MAC地址 软件
  7. 百变北京昌平龙脉温泉小鱼戏水2日自驾游(可延住)
  8. 基于VCSEL红外激光,柔性AR隐形眼镜方案诞生
  9. 伤感唯美语录_离去,让事情变得简单
  10. system.windows.controls