当前位置:   article > 正文

pytorch对已有模型的更改(常用的操作)_pytorch修改模型参数

pytorch修改模型参数

本文会做经常性的更改,如有错误或者其他补充的,请各位大佬不吝指点。

如图所示为我们的示例输出的网络结构。

引入创建的模型:

  1. import torch
  2. import simple_module
  3. mod = simple_module.Module()

一、模型的保存与读取

1.整个模型的保存与读取

  1. # 保存整个模型
  2. torch.save(mod, '../parameters/mod.pth')
  3. # 读取整个模型
  4. mod_load = torch.load('../parameters/mod.pth')

2.模型参数的保存与读取(以字典方式保存和读取)

  1. # # 保存模型的参数(以字典的方式保存)
  2. torch.save(mod.state_dict(), '../parameters/mod_parameter.pth')
  3. # 查看保存了哪些参数
  4. print(mod.state_dict().keys())
  5. print(mod.state_dict()['feature.0.0.bias'])
  6. # 读取模型的参数(以字典的方式读取)
  7. mod.load_state_dict(torch.load('../parameters/mod_parameter.pth'))
  1. odict_keys(['feature.0.0.weight', 'feature.0.0.bias', 'feature.0.1.weight',
  2. 'feature.0.1.bias', 'feature.0.1.running_mean', 'feature.0.1.running_var',
  3. 'feature.0.1.num_batches_tracked', 'feature.1.0.weight', 'feature.1.0.bias',
  4. 'feature.1.1.weight', 'feature.1.1.bias', 'feature.1.1.running_mean',
  5. 'feature.1.1.running_var', 'feature.1.1.num_batches_tracked', 'classifier.1.weight',
  6. 'classifier.1.bias'])
  7. tensor([-0.1721, -0.1222, 0.1023, -0.1484, -0.0547, -0.1922, -0.0796, -0.1784,
  8. -0.0233, -0.0271, -0.1018, 0.1875])

二、模型更改某一层

  1. # 模型修改某一层
  2. mod.classifier[1] = torch.nn.Linear(in_features=3072, out_features=20, bias=True)

三、模型删除某些层

  1. # 删除某一层,可以将该层设置为空序列
  2. mod.classifier[1] = torch.nn.Sequential()
  3. # 可以采用切片的方式删除,这样删除更加彻底
  4. mod.classifier = torch.nn.Sequential(*list(mod.classifier.children())[:-1])
  5. # 或者直接删除
  6. mod.classifier.__delattr__('1')

四、模型添加层(貌似只能在某一个块的末尾添加,后续再查找资料,有大佬可以指点一下)

  1. # 模型添加层
  2. mod.classifier.add_module(name='liner', module=torch.nn.Linear(in_features=3072, out_features=100, bias=True))

五、冻结某些层,使得训练时不进行参数更行

1.冻结某一层

  1. # 冻结某一层
  2. mod.feature[0][0].weight.requires_grad = False

2.冻结所有的参数

  1. # 冻结所有的参数
  2. for param in mod.parameters():
  3. param.requires_grad = False

3.冻结前面某部分的参数,可先将参数名称罗列出来,然后选择一部分的参数名称,利用参数的名称进行冻结。这种方式可以任意地冻结自己想要冻结的层。

  1. no_grad = []
  2. for name, value in mod.named_parameters():
  3. # print(name)
  4. no_grad.append(name)
  5. no_grad = no_grad[:-4]
  6. for name, value in mod.named_parameters():
  7. if name in no_grad:
  8. value.requires_grad = False
  9. else:
  10. value.requires_grad = True

 4.还有一种方式,就是只冻结前面几层

  1. i = 0
  2. for name, value in mod.named_parameters():
  3. value.requires_grad = False
  4. i = i + 1
  5. if i == 4:
  6. break;

或者

  1. model_parameters = model.named_parameters()
  2. for i in range(freeze):
  3. name, value = next(model_parameters)
  4. value.requires_grad = False

这是我目前想到的一个方法,还有其他方法的请大佬不吝指点。 

无论哪种方式,都是将对应层的weight的requires_grad设置为False。

5.最后还需要给优化器设置过滤器

  1. # 定义一个fliter,只传入requires_grad=True的模型参数
  2. optimizer = optim.SGD(filter(lambda p : p.requires_grad, mod.parameters()), lr=1e-2)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/217553
推荐阅读
相关标签
  

闽ICP备14008679号