模型保存与加载
- 序列化与反序列化
- 模型保存与加载的两种方式
- 模型断点续训练
按理来说我们训练好一个模型是为了以后可以更方便的去使用它,当我们训练模型是模型是被存储在内存当中的,而内存中数据一般不具有这种长久性的存储的功能,但硬盘可以长期的存储数据,所以在我们训练好模型之后,我们需要将模型从内存中转移到硬盘上进行长期存储。这就是模型的保存与加载,也可以称之为序列化与反序列化,下面介绍为什么模型的保存与加载可以被称为序列化与反序列化呢?
序列化与反序列化主要描述的是内存与硬盘之间的一个转换关系,训练好的模型在内存中是以对象的形式存储的,如果在硬盘中则是以二进制序列的形式进行存储的。
那么序列化就是指将以对象形式存储在内存中的模型再以二进制的形式存储在硬盘中,在pytoch实现中就是将模型对象转换成二进制数据再存储在硬盘中。很显然,反序列化相对应的就是指将存储在硬盘中的二进制序列化数据再重新以模型对象的形式存储至内存中,这二者是相互对应的两个操作:
Pytorch中的序列化与反序列化
-
torch.save
主要参数: -
obj:对象
-
f:输出路径
-
torch.load
主要参数: -
f:文件路径
-
map_location:指定存放位置,cpu or gpu
法一:保存整个Module
torch.save(net,path)
法二:保存模型参数
state_dict=net.state_dict()
torch.save(state_dict,path)
首先需要对模型进行保存,这里以LeNet2为例说明,分别对整个模型进行保存,以及仅对模型参数进行保存:
可以看到,程序第一、二行分别是设置保存整个模型和保存模型参数的路径,之后使用torch.save对整个模型进行保存,以及调用state_dict()方法获取模型参数并对其进行保存。
之后是torch.load(),对模型或模型参数进行加载: