通过一段时间系统的课程学习,算法攻城狮张同学对于飞桨框架的使用越来越顺手,于是他打算在企业内尝试使用飞桨进行AI产业落地。
但是AI产业落地并不是分秒钟的事情,除了专业技能过硬,熟悉飞桨的使用外,在落地过程中还会遇到很多细节的问题。这不,他就想到了两个棘手的小问题:
· 企业的数据集都比较大,使用这种大规模数据集进行模型训练的耗时会很长,往往需要持续数天甚至更长时间。这种情况下,就需要多次保存模型训练的参数,避免由于训练意外中断而前功尽弃。
· 模型训练至收敛后,需要将模型及参数保存下来,用于后续在服务器或者移动端环境中部署,在推理场景中发挥作用。
那么,如何高效地解决张同学提出的这两个问题呢?飞桨框架2.0RC为开发者提供了全新的动态图模式下的模型保存与加载体系,其中包含两个模型保存与加载的方案,分别适用于上述两个场景。(友情提示:飞桨框架2.0RC版本开始主推动态图模式,仍兼容保留对静态图模式的支持,但不再推荐使用。)
场景一:训练场景模型保存与加载(只需保存和加载模型参数即可)
在训练阶段,开发者仅需要保存和加载模型参数即可。飞桨提供了paddle.save和paddle.load接口用于实现该功能。当保存和加载模型参数时,可使用 paddle.save/load 结合Layer和Optimizer的state_dict()方法实现,这两个接口的关系入下图所示:
· state_dict是保存Layer或者Optimizer参数的键值对,state_dict的key为参数名,value为参数真实的numpy array数值;
· pdparams为Layer参数文件名的后缀;
· pdopt为Optimizer参数文件名的后缀。
相关文档获取地址:
https://www.paddlepaddle.org.cn/documentation/docs/zh/2.0-rc1/api/paddle/framework/io/save_cn.html
https://www.paddlepaddle.org.cn/documentation/docs/zh/2.0-rc1/api/paddle/framework/io/load_cn.html
下面举一个简单的线性回归模型示例。
import numpy as np
import paddle
import paddle.nn as nn
import paddle.optimizer as opt
BATCH_SIZE = 16
BATCH_NUM = 4
EPOCH_NUM = 10
IMAGE_SIZE = 784
CLASS_NUM = 10
# define a random dataset
class RandomDataset(paddle.io.Dataset):
def __init__(self, num_samples):
self.num_samples = num_samples
def __getitem__(self, idx):
image = np.random.random([IMAGE_SIZE]).astype('float32')
label = np.random.randint(0, CLASS_NUM - 1, (1, )).astype('int64')