• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    pytorch 预训练模型读取修改相关参数的填坑问题

    pytorch 预训练模型读取修改相关参数的填坑

    修改部分层,仍然调用之前的模型参数。

    resnet = resnet50(pretrained=False)
    resnet.load_state_dict(torch.load(args.predir))
     
    res_conv31 = Bottleneck_dilated(1024, 256,dilated_rate = 2)
    print("---------------------",res_conv31)
    print("---------------------",resnet.layer3[1])
     
    res_conv31.load_state_dict(resnet.layer3[1].state_dict())

    网络预训练模型与之前的模型对应不上,名称差个前缀

    model_dict = model.state_dict()
    # print(model_dict)
    pretrained_dict = torch.load("/yzc/reid_testpcb/se_resnet50-ce0d4300.pth")
    keys = []
    for k, v in pretrained_dict.items():
           keys.append(k)
    i = 0
    for k, v in model_dict.items():
        if v.size() == pretrained_dict[keys[i]].size():
             model_dict[k] = pretrained_dict[keys[i]]
             #print(model_dict[k])
             i = i + 1
    model.load_state_dict(model_dict)

    最后是修改参数名拿来用的,

    from collections import OrderedDict
    pretrained_dict = torch.load('premodel')
     
    new_state_dict = OrderedDict()
     
    # for k, v in mgn_state_dict.items():
    #     name = k[7:]  # remove `module.`
    #     new_state_dict[name] = v
    # self.model = self.model.load_state_dict(new_state_dict)
     
    for k, v in pretrained_dict.items():
        name = "model.module."+k   # remove `module.`
        # print(name)
        new_state_dict[name] = v
    self.model.load_state_dict(new_state_dict)

    pytorch:加载预训练模型中的部分参数,并固定该部分参数(真实有效)

    大家在学习pytorch时,可能想利用pytorch进行fine-tune,但是又烦恼于参数的加载问题。下面我将讲诉我的使用心得。

    Step1: 加载预训练模型,并去除需要再次训练的层

    #注意:需要重新训练的层的名字要和之前的不同。
    model=resnet()#自己构建的模型,以resnet为例
    model_dict = model.state_dict()
    pretrained_dict = torch.load('xxx.pkl')
    pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model_dict}
    model_dict.update(pretrained_dict)
    model.load_state_dict(model_dict)

    Step2:固定部分参数

    #k是可训练参数的名字,v是包含可训练参数的一个实体
    #可以先print(k),找到自己想进行调整的层,并将该层的名字加入到if语句中:
    for k,v in model.named_parameters():
        if k!='xxx.weight' and k!='xxx.bias' :
            v.requires_grad=False#固定参数

    Step3:训练部分参数

    #将要训练的参数放入优化器
    optimizer2=torch.optim.Adam(params=[model.xxx.weight,model.xxx.bias],lr=learning_rate,betas=(0.9,0.999),weight_decay=1e-5)

    Step4:检查部分参数是否固定

    debug之后,程序正常运行,最好检查一下网络的参数是否真的被固定了,如何没固定,网络的状态接近于重新训练,可能会导致网络性能不稳定,也没办法得到想要得到的性能提升。

    for k,v in model.named_parameters():
       if k!='xxx.weight' and k!='xxx.bias' :
       print(v.requires_grad)#理想状态下,所有值都是False

    需要注意的是,操作失误最大的影响是,loss函数几乎不会发生变化,一直处于最开始的状态,这很可能是因为所有参数都被固定了。

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

    您可能感兴趣的文章:
    • Pytorch通过保存为ONNX模型转TensorRT5的实现
    • pytorch_pretrained_bert如何将tensorflow模型转化为pytorch模型
    • pytorch模型的保存和加载、checkpoint操作
    • PyTorch 如何检查模型梯度是否可导
    • 解决Pytorch修改预训练模型时遇到key不匹配的情况
    • PyTorch模型转TensorRT是怎么实现的?
    上一篇:解决pytorch 损失函数中输入输出不匹配的问题
    下一篇:解决Pytorch修改预训练模型时遇到key不匹配的情况
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    pytorch 预训练模型读取修改相关参数的填坑问题 pytorch,预,训练,模型,读取,