多卡训练后的保存模型开头为"module.XXX",参考两篇博客加载仍然报错,仔细研究发现,根据se_resnext50_32x4d()预训练模型改编的模型有些层名字中含有“XXXfc_module.layerXXX",多卡训练后变成”module.XXXfc_module.layerXXX"。此时根据python中字符串替换函数,string.replace('module.', '')把后面的"module."也给误伤删掉了导致错误,因此在函数中加一个1,即string.replace('module.', '', 1)最多只替换掉一个字符串。验证跑的通,问题解决。
model = se_resnext50_32x4d(num_classes=9, pretrained=None) # 在源码基础上改变后
pretrained_dict = torch.load("0821_fine.pth") # 加载多卡训练后模型的字典
net_dict = model.state_dict() # 当前模型的字典(单卡)
# 剔除多卡中的module关键字
for k, v in pretrained_dict.items():
# 只删除一个
name = k.replace('module.', '', 1)
net_dict[name] = v
# 根据预训练字典更新当前模型
model.load_state_dict(net_dict)
model.cuda()
参考:1.https://blog.csdn.net/qq_39638957/article/details/98349305
参考:2.https://blog.csdn.net/qidailiming1994/article/details/107285658/