[PyTorch]预训练权重的转换

这篇具有很好参考价值的文章主要介绍了[PyTorch]预训练权重的转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

        众所周知,使用大量数据预训练后的骨干网络可以提升整个模型的泛化能力,而我们如果将网络的骨干网络替换后则不能直接使用原来的权重。这个项目的作用是在你替换骨干网络后可以将网络预训练权重一并“偷”过来。

        下给结论:将DeeplabV3+的骨干网络由Xception替换为mobilenetv3,使用预训练和不适用预训练,第1个epoch和前171个epoch的结果,以及前200轮的损失函数如下:

不适用预训练:
--->1轮miou如下:
   mIoU: 16.11; mPA: 16.67; Accuracy: 96.68
使用预训练:
--->1轮miou如下:
   mIoU: 40.53; mPA: 56.8; Accuracy: 97.09
不适用预训练:
--->171轮miou如下:
   mIoU:64.68 ; mPA: 78.0; Accuracy: 98.82
使用预训练:
--->171轮miou如下:
   mIoU:86.08 ; mPA: 92.54; Accuracy: 99.56

[PyTorch]预训练权重的转换

        可以看到,将预训练权重转换并加载后,无论是对早期的梯度下降还是最终的模型性能都有显著提升

一、权重文件的结构

        pyotrch的权重文件为.pth。其由一个collections.OrderedDict构成,是一个序列化的集合。

[PyTorch]预训练权重的转换

         其由一个单位由两个元素组成:该层的名称+该层的Tensor权重。通过对其遍历,可以将这两者分别取出:

for k, v in pretrained_dict.items():

[PyTorch]预训练权重的转换

         而k的数据类型经过验证后为str型,在原版的自适应加载代码中,无法使用其他网络的预训练权重的原因是:权重名称不匹配,既然权重名仅为str型,那么使用replace将不一致的部分修改一致即可将权重文件添加到网络中。

二、修改权重名

        首先,这种方法仅针对权重名有一定关联的情况,所以大家在移植骨干网络时尽可能使函数名和构造名与原网络保持一致。由于骨干网络位于模型开始的位置,我们输出第1层即可得知修改后的网络与原版网络的差别,本例中使用bubbliiiing的YoloV4中的mobilenetv3和deeplabV3+作为素材,将mobilenentv3网络移入deeplabv3+。

        在python3中直接输出OrderedDict的某层会报错,因为其是一个序列化的数据机构,我们需要使用list(.)将其转换为无序列数据结构再输出,使用下面代码即可完成输出:

print('源模型文件格式为:{}'.format(list(pretrained_dict.keys())[0]))
print('目标模型文件格式为:{}'.format(list(model_dict.keys())[0]))

        输出后可知,两个模型之间的差距为:

[PyTorch]预训练权重的转换

         使用两个变量暂存两者之间的不同,在将这两个变量送入replace()函数即可完成层名的修改。如上图中,源模型和目标模型的差距是源模型比目标模型多一个model.,将其删除即可。

三、转换并保存

        本例中使用的函数已经单独封装:

def model_converter(custom_model ,model_path):
    model_dict      = custom_model.state_dict()
    pretrained_dict = torch.load(model_path, map_location = torch.device('cpu'))
    load_key, no_load_key, temp_dict = [], [], {}
    #  展示骨干网络的第一层
    print('源模型文件格式为:{}'.format(list(pretrained_dict.keys())[0]))
    print('目标模型文件格式为:{}'.format(list(model_dict.keys())[0]))
    print('请将两模型之间不同的部分输入:')
    orgStr = input('源模型:')
    targetStr = input('目标模型:')

    print('--->开始模型转换')
    for k, v in pretrained_dict.items():
        k = k.replace(orgStr,targetStr)
        if k in model_dict.keys() and np.shape(model_dict[k]) == np.shape(v):
            temp_dict[k] = v
            load_key.append(k)
        else:
            no_load_key.append(k)
    #  将权重更新到模型中
    model_dict.update(temp_dict)
    custom_model.load_state_dict(model_dict)
    #  保存模型
    torch.save(custom_model.state_dict(), 'converted_weights.pth')

        将实例化后的模型和源模型文件输入本函数即可,经过修改后匹配部分会自动转换,不匹配的部分会暂存在no_load_key中,可自行对其进行分析。经过测试,这种方法基本能完成骨干网络的转换。

[PyTorch]预训练权重的转换文章来源地址https://www.toymoban.com/news/detail-420062.html

到了这里,关于[PyTorch]预训练权重的转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 模型权重和深度学习训练框架之间的关系

    通常我们可以看到有Caffe或Pytorch或TensorFlow的模型参数文件 不同的团队可能会使用不同的深度学习训练框架, 然后使用其 内部的模型权重保存函数 进行保存, 以便之后 自己的复用 或 发布开源 , 让别人使用自己已经训练好的模型权重, 在其基础上进一步做改进或训练 那么该团

    2024年02月11日
    浏览(53)
  • size mismatch问题:训练权重不匹配问题

    在测试二阶段和三阶段模型的时候程序一直报错: RuntimeError: Error(s) in loading state_dict for Eff:     size mismatch for fc.weight: copying a param with shape torch.Size([18, 1000]) from checkpoint, the shape in current model is torch.Size([14, 1000]).     size mismatch for fc.bias: copying a param with shape torch.Size([18]) from

    2023年04月08日
    浏览(33)
  • pytorch保存、加载和解析模型权重

    1、模型保存和加载          主要有两种情况:一是仅保存参数,二是保存参数及模型结构。 保存参数:          torch.save(net.state_dict()) 加载参数(加载参数前需要先实例化模型):          param = torch.load(\\\'param.pth\\\')          net.load_state_dict(param) 保存模型结构

    2024年02月16日
    浏览(44)
  • YOLO训练得到权重后无法检测detect目标

    通过自己制造数据集,跑完train.py文件后,得到自己的权重文件 将权重文件带入detect.py文件中,发现可以运行,但是无法识别图片和视频中的目标 3.opencv-python版本太高了,看了一眼,果然版本都到4.6了,猜想opencv-python版本问题,结果——还是不行 https://blog.csdn.net/adai5210/ar

    2024年02月12日
    浏览(42)
  • Yolov8改进模型后使用预训练权重迁移学习训练自己的数据集

    yolov8 github下载 1、此时确保自己的数据集格式是yolo 格式的(不会的去搜教程转下格式)。 你的自制数据集文件夹摆放 主目录文件夹摆放 自制数据集data.yaml文件路径模板 2、把data.yaml放在yolov8–ultralytics-datasets文件夹下面 3、然后模型配置改进yaml文件在主目录新建文件夹v8_

    2024年02月06日
    浏览(52)
  • Pytorch权重初始化/参数初始化

    refer: 【Pytorch】各网络层的默认初始化方法 https://blog.csdn.net/guofei_fly/article/details/105109883 其实Pytorch初始化方法就在各自的层的 def reset_parameters(self) - None: 方法中。 有人可能会问 为什么这个方法和Pytorch直接出来的权重初始值不一样 ?单步调试会发现其实这个方法运行了至少两

    2024年02月11日
    浏览(66)
  • 深度学习技术栈 —— Pytorch中保存与加载权重文件

    权重文件是指训练好的模型参数文件,不同的深度学习框架和模型可能使用不同的权重文件格式。以下是一些常见的权重文件格式: PyTorch 的模型格式: .pt 文件。 Darknet 的模型格式: .weight 文件。 TensorFlow 的模型格式: .ckpt 文件。 一、参考文章或视频链接 [1] Navigating Mode

    2024年01月19日
    浏览(57)
  • LLM-LLaMA:手动模型转换与合并【Step 1: 将原版LLaMA模型转换为HF(HuggingFace)格式;Step 2: 合并LoRA权重,生成全量模型权重】

    准备工作 运行前确保拉取仓库最新版代码: git pull 确保机器有足够的内存加载完整模型(例如7B模型需要13-15G)以进行合并模型操作。 务必确认基模型和下载的LoRA模型完整性,检查是否与SHA256.md所示的值一致 ,否则无法进行合并操作。原版LLaMA包含: tokenizer.model 、 tokeni

    2024年02月13日
    浏览(62)
  • 【Segment Anything Model】论文+代码实战调用SAM模型预训练权重+相关论文

    上篇文章已经全局初步介绍了SAM和其功能,本篇作为进阶使用。点击订阅专栏查看专栏列表和对应知识点,本文为seg SAM系列文章,在持续更新。

    2024年02月05日
    浏览(52)
  • 剑指YOLOv5改进损失函数,具有自适应阈值的 Slide 权重函数,使模型在训练期间更加关注硬样本

    💡 本篇内容 :剑指YOLOv5改进损失函数,设计具有自适应阈值的 Slide 权重函数,使模型在训练期间更加关注硬样本 💡🚀🚀🚀本博客 改进源代码改进 适用于 YOLOv5 按步骤操作运行改进后的代码即可 💡:重点:该 专栏 《剑指YOLOv5原创改进》只更新改进 YOLOv5 模型的内容 剑

    2024年02月11日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包