net.to(device)
**常用方法2:**
net = MobileNetV2(num_class=5)
net_weights = net.state_dict()
model_weights_path = “./mobilenet_v2pre.pth”
pre_weights = torch.load(model_weights_path)
delete classifier weights
这种方法主要是遍历字典,.pth文件(权重文件)的本质就是字典的存储
通过改变我们载入的权重的键值对,可以和当前的网络进行配对的
这里举到的例子是对"classifier"结构层的键值对剔除,或者说是不载入该模块的训练权重
pre_dict = {k: v for k, v in pre_weights.items() if “classifier” not in k}
另一种方法会直接两种权重对比,直接两种方法对比,减少问题的存在
pre_dict = {k: v for k, v in pre_weight.items()
if net_weights[k].numel() == v.numel()}
如果修改了载入权重或载入权重的结构和当前模型的结构不完全相同,需要加strict=False,保证能够权重载入
net.load_state_dict(pre_dict, strict=False)
net.to(device)
**灵活提升:**
net = resnet34(num_classes=5)
pre_weights = torch.load(model_weight_path, map_location=device)
del_key = []
for key, _ in pre_weights.items():
if “fc” in key: # 这里可以多加一下字段,比如 or “layer4” in key:
del_key.append(key)
missing_keys表示net中的部分权重未出现在pre_weights中
unexpected_keys表示pre_weights当中有一部权重不在net中
missing_keys, unexpected_keys = net.load_state_dict(del_key, strict=False)
执行结果
[missing_keys]:
fc.weight
fc.bias
[unexpected_keys]:
### 载入权重常见问题
1. `key-val`不匹配问题
解决方式:模型结构修改了,没有正确修改预训练权重,导致载入权重与模型不同,使用上文中的方法适当修改载入权重即可
2. 载入预训练权重`param`名称和模型中的`param`名称不同,导致载入失败
解决方法:修改模型中的`para`名称,或者修改网络中模块的名称。
## 冻结训练
冻结训练方法很简单,只要对`requires_grad = False`即可
for name, para in model.named_parameters():
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Linux运维工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Linux运维全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Linux运维知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)
得这些内容对你有帮助,可以添加VX:vip1024b (备注Linux运维获取)**
[外链图片转存中…(img-GyoFHoZB-1712714377855)]