• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

hapi: 飞桨核心框架 高层API

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

hapi

开源软件地址:

https://gitee.com/paddlepaddle/hapi

开源软件介绍:

飞桨核心框架 高层API

简介 | 特性 | 快速使用 | 新增功能 | 使用示例

简介

飞桨框架2.0全新推出高层API,是对飞桨API的进一步封装与升级,提供了更加简洁易用的API,进一步提升了飞桨的易学易用性,并增强飞桨的功能。

飞桨高层API面向从深度学习小白到资深开发者的所有人群,对于AI初学者来说,使用高层API可以简单快速的构建深度学习项目,对于资深开发者来说,可以快速完成算法迭代。

飞桨高层API具有以下特点:

  • 易学易用: 高层API是对普通动态图API的进一步封装和优化,同时保持与普通API的兼容性,高层API使用更加易学易用,同样的实现使用高层API可以节省大量的代码。
  • 低代码开发: 使用飞桨高层API的一个明显特点是,用户可编程代码量大大缩减。
  • 动静转换: 高层API支持动静转换,用户只需要改一行代码即可实现将动态图代码在静态图模式下训练,既方便用户使用动态图调试模型,又提升了模型训练效率。

在功能增强与使用方式上,高层API有以下升级:

  • 模型训练方式升级: 高层API中封装了Model类,继承了Model类的神经网络可以仅用几行代码完成模型的训练。
  • 新增图像处理模块transform: 飞桨新增了图像预处理模块,其中包含数十种数据处理函数,基本涵盖了常用的数据处理、数据增强方法。
  • 提供常用的神经网络模型可供调用: 高层API中集成了计算机视觉领域和自然语言处理领域常用模型,包括但不限于mobilenet、resnet、yolov3、cyclegan、bert、transformer、seq2seq等等。同时发布了对应模型的预训练模型,用户可以直接使用这些模型或者在此基础上完成二次开发。

特性

易学易用

高层API基于飞桨动态图实现,兼容飞桨动态图的所有功能,既秉承了动态图易学、易用、易调试的特点,又对飞桨的动态图做了进一步的封装与优化。

低代码开发

相比较与动态图的算法实现,使用高层API实现的算法可编程代码量更少,原始的动态图训练代码需要20多行代码才能完成模型的训练,使用高层API后,仅用8行代码即可实现相同的功能。

使用普通API与高层API实现手写字符识别对比如下图,左边是普通动态图API的实现,右边是使用高层API的实现,可以明显发现,使用高层API的代码量更少。

动静统一

高层API中实现了动静统一,用户无需感知到静态图、动态图的区别,只需要改一行代码即可实现将动态图代码在静态图模式下训练。动态图更方便调试模型,静态图的训练方式训练效率更高。

高层API默认训练方式和主框架保持一致,采用动态图的训练方式,我们可以使用paddle.disable_static()来开启动态图训练模式,用paddle.enable_static()开启静态图模式训练。

# 一行代码切换动态图训练模式## 动态图训练模式paddle.disable_static()## 静态图训练模式# paddle.enable_static()# 设置训练设备环境paddle.set_device('gpu')# 声明网络结构model = paddle.Model(Mnist())# 定义优化器optimizer = paddle.optimizer.SGD(learning_rate=0.001, parameters=model.parameters())# 调用prepare() 完成训练的配置model.prepare(optimizer, CrossEntropy(), Accuracy())# 调用 fit(),启动模型的训练model.fit(train_dataset, val_dataset, batch_size=100, epochs=1, log_freq=100, save_dir="./output/")

快速使用

以mnist手写字符识别为例,介绍飞桨高层API的使用方式。

1. 搭建网络结构

使用高层API组建网络与动态图的组网方式完全相同,继承paddle.nn.Layer来定义网络结构即可。

高层API组网方式如下

import paddle# 设置执行环境为GPUpaddle.set_device('gpu')# 使用动态图训练方式paddle.disable_static()class Mnist(paddle.nn.Layer):    def __init__(self):        super(Mnist, self).__init__()        self.fc = paddle.nn.Linear(input_dim=784, output_dim=10)    # 定义网络结构的前向计算过程    def forward(self, inputs):        outputs = self.fc(inputs)        return outputs

2. 训练准备

在开始训练前,需要定义优化器、损失函数、度量函数,准备数据等等。这些过程均可以在高层API Model类中的prepare函数中完成。

# 定义输入数据格式inputs = [Input([None, 784], 'float32', name='image')]labels = [Input([None, 1], 'int64', name='label')]# 声明网络结构model = paddle.Model(Mnist())optimizer = paddle.optimizer.SGD(learning_rate=0.001,                                 parameters=model.parameters())# 使用高层API,prepare() 完成训练的配置model.prepare(optimizer,              paddle.nn.CrossEntropy(),              paddle.metricAccuracy())

3. 启动训练

使用高层API完成训练迭代过程时,使用一行代码即可构建双层循环程序,去控制训练的轮数和数据读取过程。

from paddle.vision.datasets import MNIST as MnistDataset# 定义数据读取器train_dataset = MnistDataset(mode='train')val_dataset = MnistDataset(mode='test')# 启动训练model.fit(train_dataset, val_dataset, batch_size=100, epochs=10, log_freq=100, save_dir="./output/")

高层API中通过fit函数完成训练的循环过程,只需要设置训练的数据读取器、batchsize大小,迭代的轮数epoch、训练日志打印频率log_freq,保存模型的路径即可。

新增功能

除了使用高层API实现一行代码启动训练外,还新增了以下功能:

  • paddle.vision.transforms 图像数据增强模块
  • paddle.vision.models 模型调用模块

transforms

paddle.vision.transforms。图像预处理模块transforms包括一系列的图像增强与图像处理实现,对处理计算机视觉相关的任务有很大帮助。

下表中列出Transforms支持的数据处理和数据增强API,如下所示:

transform的数据处理实现函数功能
Compose组合多种数据变换
BatchCompose用于处理批数据的预处理接口组合
Resize将图像转换为固定大小
RandomResizedCrop根据输入比例对图像做随机剪切,然后resize到指定大小
CenterCrop以图像的中心为中心对图像做剪切
CenterCropResize对图像做padding,padding后的图像做centercrop,然后resize到指定大小
RandomHorizontalFlip随机对图像做水平翻转
RandomVerticalFlip随机对图像做垂直翻转
RandomCrop在随机位置裁剪输入的图像
RandomErasing随机选择图像中的一个矩形区域并将其像素删除
RandomRotate按角度旋转图像
Permute将数据的的维度换位
Normalize用指定的均值和标准差对数据做归一化
GaussianNoise给数据增加高斯噪声
BrightnessTransform调整输入图像的亮度
SaturationTransform调整输入图像的饱和度
ContrastTransform调整输入图像的对比度
HueTransform调整图像的色调
ColorJitter随机调整图像的亮度、饱和度、对比度、和色调
Grayscale将图像转换为灰度
Pad使用特定的填充模式和填充值来对输入图像进行填充

使用方法如下:

from paddle.vision import transformsimport cv2img_path = "./output/sample.jpg"img = cv2.imread(img_path)# 使用Compose 将可以将多个数据增强函数组合在一起trans_funcs = transforms.Compose([transforms.RandomResizedCrop(224),                                transforms.RandomHorizontalFlip(),                                transforms.BrightnessTransform(0.2)])label = Noneimg_processed, label = trans_funcs(img, label)

上述代码的效果图如下:

paddle.vision.models

paddle.vision.models中包含了高层API对常用模型的封装,包括ResNet、VGG、MobileNet、LeNet等。使用这些现有的模型,可以快速的完成神经网络的训练、finetune等。

使用paddle.vision中的模型可以简单快速的构建一个深度学习任务,比如13代码即可实现resnet在Cifar10数据集上的训练:

from paddle.vision.models import resnet50from paddle.vision.datasets import Cifar10from paddle.optimizer import Momentumfrom paddle.regularizer import L2Decayfrom paddle.nn import CrossEntropyfrom paddle.metirc import Accuracy# 调用resnet50模型model = paddle.Model(resnet50(pretrained=False, num_classes=10))# 使用Cifar10数据集train_dataset = Cifar10(mode='train')val_dataset = Cifar10(mode='test')# 定义优化器optimizer = Momentum(learning_rate=0.01,                     momentum=0.9,                     weight_decay=L2Decay(1e-4),                     parameters=model.parameters())# 进行训练前准备model.prepare(optimizer, CrossEntropy(), Accuracy(topk=(1, 5)))# 启动训练model.fit(train_dataset,          val_dataset,          epochs=50,          batch_size=64,          save_dir="./output",          num_workers=8)

更多使用示例

更多的高层API使用示例请参考:


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap