Pytorch目前成为学术界最流行的DL框架,没有之一。很大程度上,简洁直观地操作有关。模型的保存和加载,于pytorch而言,也是很简单的。本文做了一个比较实验,方便大家理解。
首先,要清楚几个函数:torch.save,torch.load,state_dict(),load_state_dict()。
先举最简单的例子:
import torch
model = torch.load('my_model.pth')
torch.save(model, 'new_model.pth')
上面的代码非常直观,一载一存。但是有一个问题,这样保存的pth文件直接包含了整个模型的结构。当你需要灵活加载模型参数时,比如只加载部分参数,那么这种情况保存的pth文件读取进来还得额外解析出“参数文件”。
如果想更灵活对待咱们训练好的模型参数,咱们可以使用下面这个方法。pytorch把所有的模型参数用一个内部定义的dict进行保存,自称为“state_dict”。这个所谓的state_dict就是不带模型结构的模型参数了~
咱们的加载和保存就发生了一点微妙的变化:
import torch
model = MyModel() # init your model class, build the graph shape
state_dict = torch.load('model_state_dict.pth')
model.load_state_dict(state_dict)
torch.save(model.state_dict(), 'model_state_dict1.pth')
比较上面两段代码,咱们可以有一下结论:
到这里还不清楚的可以留言提问~
参考链接:https://pytorch.org/tutorials/beginner/basics/saveloadrun_tutorial.html
脚本如下:
import torch
import torchvision.models as models
model = models.vgg16(pretrained=True)
torch.save(model.state_dict(), 'only_weights.pth')
model_state_dict = torch.load('only_weights.pth')
model1 = models.vgg16() # describe the graph shape
model1.load_state_dict(model_state_dict)
model1.eval()
torch.save(model1, 'whole_model.pth')
model2 = torch.load('whole_model.pth')
model2.eval()
# model3 = torch.load('only_weights.pth')
# model3.eval() # Error
model3切换到eval()模式就会报错,原因是model3只包含weights而缺乏图结构~