文章目录
- 一、问题描述
- 二、解决方法
- 三、其他问题
- Reference
一、问题描述
导入之前训练好的模型权重后使用模型预测时如题报错size mismatch for embedding.embed_dict.userid.weight
。
state_dict = torch.load(model_path)
model.load_state_dict(state_dict)
二、解决方法
是因为导入的模型权重(之前训练好、保存的)的维度和当前定义的model
的权重维度不同,所以我选择修改下当前定义的model
,即将自己返回如下beat_sparse_features
等的dataloader,其读取的数据换成之前模型训练的数据,使得模型定义后的model
的模型权重和导入的权重一致。
model = DeepFM(deep_features=beat_dense_features + beat_sparse_features,fm_features=beat_sparse_features,mlp_params={"dims": [256, 128], "dropout": 0.2, "activation": "relu"},
)
当然如果根据大家的实际情况改动,如很多时候实例化模型时改变实参即可。
三、其他问题
可能还有其他情况也会报这个错,如导入预训练模型进行微调,首先加载预训练模型权重:
model = models.resnet34(pretrained=False)
pretrained_dict = torch.load('./pretrain/resnet34-333f7ec4.pth')
pretrained_dict = {k: v for k, v in pretrained_dict.items() if k in model.state_dict()}
model.load_state_dict(pretrained_dict)
model.fc = torch.nn.Linear(512, 5) # 512为原始fc的数目,5是自己任务的分类数
由于分类类别不一致,报错size mismatch for fc.bias: copying a param with shape torch.Size([512]) from checkpoint, the shape in current model is torch.Size([x]).
,这里可以选择不加载fc层:
model = models.resnet34(pretrained=False)
pretrained_dict = torch.load('./pretrain/resnet34-333f7ec4.pth')
model_dict = model.state_dict()
pretrained_dict = {k: v for k, v in pretrained_dict.items() if (k in model_dict and 'fc' not in k)} # 将'fc'这一层的权重选择不加载即可。
model_dict.update(pretrained_dict) # 更新权重
model.load_state_dict(model_dict)
可能还有其他情况,如NLP词表维度不一致等等,后面遇到再更新该帖。如有不对之处,恳请大佬们指正!
Reference
[1] 解决CNN中训练权重参数不匹配size mismatch for fc.weight,size mismatch for fc.bias
[2] torch 封装文本数据预处理、训练、评估、预测过程
[3] 关于Pytorch加载模型参数的避坑指南