模型开发

https://www.paddlepaddle.org.cn/documentation/docs/zh/guides/02_paddle2.0_develop/index_cn.html

本部分将介绍飞桨框架2.0的开发流程。
为了快速上手飞桨框架2.0,你可以参考 10分钟快速上手飞桨 ;
当完成了快速上手的任务后,下面这些模块会阐述如何用飞桨框架2.0,实现深度学习过程中的每一步。具体包括:

  • 数据集定义与加载 : 飞桨框架数据加载的方式,主要为paddle.io.Dataset + paddle.io.DataLoader,以及飞桨内置数据集的介绍。
  • 数据预处理 : 飞桨框架数据预处理的方法,主要是paddle.vision.transform.*
  • 模型组网 : 飞桨框架组网API的介绍,主要是paddle.nn.*,然后是飞桨框架组网方式的介绍,即 Sequential 的组网与 SubClass 的组网。
  • 训练与预测 : 飞桨框架训练与预测的方法,有两种方式,一种是使用高层APIpaddle.Model封装模型,然后调用model.fit()、model.evaluate()、model.predict()完成模型的训练与预测;另一种是用基础API完成模型的训练与预测,也就是对高层API的拆解。
  • 资源配置 : 飞桨框架在单机单卡、单机多卡的场景下完成模型的训练与预测。
  • 自定义指标 : 飞桨框架自定义指标的方法,主要包含自定义Loss、自定义Metric与自定义Callback。
  • 模型的加载与保存 : 飞桨框架模型的加载与保存体系介绍。
  • 模型转ONNX协议 : 飞桨框架模型转换为ONNX格式介绍。

1.1 导入飞桨

  1. import paddle
  2. print(paddle.__version__)

1.2 加载内置数据集

飞桨框架内置了一些常见的数据集,在这个示例中,你可以加载飞桨框架的内置数据集:手写数字体数据集。
这里加载两个数据集,一个用来训练模型,一个用来评估模型。

from paddle.vision.transforms import ToTensor

train_dataset = paddle.vision.datasets.MNIST(mode='train', transform=ToTensor())
val_dataset =  paddle.vision.datasets.MNIST(mode='test', transform=ToTensor())

1.3 模型搭建

通过 Sequential 将一层一层的网络结构组建起来。注意,需要先对数据进行 Flatten 操作,将[1, 28, 28]形状的图片数据改变形状为[1, 784]。

mnist = paddle.nn.Sequential(
    paddle.nn.Flatten(),
    paddle.nn.Linear(784, 512),
    paddle.nn.ReLU(),
    paddle.nn.Dropout(0.2),
    paddle.nn.Linear(512, 10)
)

1.3飞桨框架内置模型

你除了可以通过上述方式组建模型外,还可以使用飞桨框架内置的模型,路径为 paddle.vision.models ,具体列表如下:

print('飞桨框架内置模型:', paddle.vision.models.__all__)

飞桨框架内置模型: [‘ResNet’, ‘resnet18’, ‘resnet34’, ‘resnet50’, ‘resnet101’, ‘resnet152’, ‘VGG’, ‘vgg11’, ‘vgg13’, ‘vgg16’, ‘vgg19’, ‘MobileNetV1’, ‘mobilenet_v1’, ‘MobileNetV2’, ‘mobilenet_v2’, ‘LeNet’]

使用方式如下:

# 使用内置的模型,这边可以选择多种不同网络,这里选了mobilenet_v1网络
model = paddle.vision.models.mobilenet_v1(pretrained=True, num_classes=train_parameters["class_dim"])
model = paddle.Model(model)

你可以通过paddle.summary()方法查看模型的结构与每一层输入输出形状,具体如下:**

paddle.summary(lenet, (64, 1, 28, 28))

1.4 模型训练

在训练模型前,需要配置训练模型时损失的计算方法与优化方法,你可以使用飞桨框架提供的 prepare 完成,之后使用 fit 接口来开始训练模型。

# 预计模型结构生成模型实例,便于进行后续的配置、训练和验证
model = paddle.Model(mnist)
# 模型训练相关配置,准备损失计算方法,优化器和精度计算方法
model.prepare(paddle.optimizer.Adam(parameters=model.parameters()),
              paddle.nn.CrossEntropyLoss(),
              paddle.metric.Accuracy())
# 开始模型训练
model.fit(train_dataset,
          epochs=5,
          batch_size=64,
          verbose=1)

1.5 模型评估

你可以使用预先定义的验证数据集来评估前一步训练得到的模型的精度。

model.evaluate(val_dataset, verbose=0)

{‘loss’: [0.0], ‘acc’: 0.9804}
可以看出,初步训练得到的模型效果在98%附近,在逐渐了解飞桨后,你可以通过调整其中的训练参数来提升模型的精度。
至此你就通过飞桨几个简单的API完成了一个深度学习任务,你也可以针对自己的需求来更换其中的代码,比如对数据集进行增强、使用 CNN 模型等,飞桨官网提供了丰富的教程与案例可供参考。

案例:基于Paddle2.0的猫12分类
https://aistudio.baidu.com/aistudio/projectdetail/1493470