C++中与Python推理结果不一致
问题分析:
该问题主要是Pytorch模型存储和读取的方式导致的,一般分为两种保存与读取方式:
- 直接存储与读取整个模型的框架与参数
存储:
torch.save(model, "model.pkl" )
读取:
model = torch.load("model.pkl" )
- 仅存储模型参数
存储:
torch.save(model.state_dict(), "model.pkl" )
读取:
model = net() # 自己定义的模型
model.load_state_dict(torch.load("model.pkl"))
然而,我是用的是方便断点恢复的存储与读取方式,读取模型的时候还是按照第2种方式。
这种情况在Python里没啥问题,推理结果很正常。但是,在C++里就不行了,因为pkl转pt的时候,关键词"net"对应的权重没有转换好。
- 断点恢复,可存储模型参数、学习率、优化器……(按照下面的进行修改)
存储:
自定义要保存的参数信息
checkpoint = {
"net": model.state_dict(),
"optimizer": optimizer.state_dict(),
"epoch": epoch,
"scheduler": scheduler.state_dict()
}
torch.save(model.state_dict(), "model.pkl" )
读取:
model = net() # 自己定义的模型
checkpoint = torch.load( "model.pkl")
model .load_state_dict(checkpoint["net"]) # 加载模型参数