我们在训练深度学习模型的过程中,最好对已经训练好的深度学习模型进行保存,或者方便的加载别人训练好的模型微调节省训练时间,实现高效率解决问题。

为什么需要模型文件

  • 深度学习的模型参数超级多比如:Transformer模型、Bert模型等。
  • 训练的数据集一般很大,比如:1000G以上等。
  • 若本地电脑的算力或者实验室的服务器算力基本不够,训练模型花费时间多,一个模型短则训练几天不能停,甚至几个月,有可能发生内存不够等。这时若有类似的训练好的模型可以直接拿来用然后微调是非常好的。

torch.save()实现对网络结构和模型参数的保存.有两种保存方式

  • 一是保存整个神经网络的的结构信息和模型参数信息,save的对象是整个网络模型;
  • 二是只保存神经网络的训练模型参数,save的对象是net.state_dict()。

假设有一个训练好的模型名叫net1

torch.save(net1, ‘7-net.pth’) # 保存整个神经网络的结构和模型参数

torch.save(net1, ‘7-net.pkl’) # 同上

torch.save(net1.state_dict(), ‘7-net_params.pth’) # 只保存神经网络的模型参数

torch.save(net1.state_dict(), ‘7-net_params.pkl’) # 同上

如果使用torch.save方法来进行模型参数的保存,那保存文件的后缀其实没有任何影响,结果都是一样的,很多.pkl的文件也是用torch.save保存下来的,和.pth文件一模一样的

  • 不过,如果应用场景不是在这里,这两种格式的文件还是有区别的,.pkl文件是python里面保存文件的一种格式,如果直接打开会显示一堆序列化的东西,其实就是以二进制形式存储的,如果去read这些文件,则需要用’rb’而不是’r’模式。
  • 而.pth文件则有不同的应用,Python在遍历已知的库文件目录过程中,如果见到一个.pth 文件,就会将文件中所记录的路径加入到 sys.path 设置中,于是 .pth 文件指明的库也就可以被 Python 运行环境找到了。

但其实不管pkl文件还是pth文件,都是以二进制形式存储的,没有本质上的区别,你用pickle这个库去加载pkl文件或pth文件,效果都是一样的。

模型文件的后缀

  • .pt :这个后缀在官方文档里使用较多。
  • .pth :这个后缀一般大家觉得惯例使用这个。
  • .pkl:这个后缀是因为 Python 有一个序列化模块 pickle ,然后使用它保存模型时,通常会起一个以 .pkl为后缀名的文件。