,What深度学习作为人工智能时代的核心技术,在学术和学术上都发挥着越来越重要的作用和工业领域近年来。但是深度学习的理论太难学,开发过程太复杂,让很多人对深度学习望而却步。为了简化深度学习的学习过程,降低深度学习的开发难度,百度飞桨框架经过近一年的打磨,不断优化深度学习API,针对开发者的使用场景进行封装。在最新版本的飞桨框架中,推出了全新的高低融合、科学统一的飞桨API体系。Paddle框架将API分为两种类型,基础API和高级API。以披萨为例,一般有两种做法:一种是我们准备面粉、牛奶、火腿等配料,经过精心加工,就可以做出美味的披萨;二是我们买的是预烤披萨,做好的馅料,加热披萨就可以直接吃。那么这两种方法有什么区别呢?使用第一种方法,自己准备食材,可以随心所欲地搭配菜肴,做酱汁来满足我们不同的口味。不过,这更适合“老司机”。如果是新朋友,很有可能翻车;商家预烤的披萨和馅料,直接加热即可快速制作,口感有保障;但是,与方法一相比,我们的口味选择会少一些。以框架类比,基础API对应方法1,高层API对应方法2。使用基础API,我们可以不受任何限制地任意构建自己的深度学习模型;而使用第二种方法,我们可以快速实现模型,但它的自主性可能较小。不过,与做披萨不同的是,桨架可以是真正的“鱼和熊掌”,可以兼得。因为高层API本身不是一个独立的系统,可以与基础API结合使用,实现高层集成,使用起来更加方便。在开发过程中,我们既可以享受到基础API的强大功能,又可以兼顾到高级API的便利性。高层API,All飞桨框架的高层API全景图如下:从图中可以看出,飞桨框架的高层API由五个模块组成,分别是数据加载、模型构建、模型训练、模型可视化和高级使用。针对不同的使用场景,Paddle框架提供了不同的高层API,从而降低开发难度,让大家轻松上手深度学习。我们先通过一个深度学习中经典的手写数字分类任务来了解一下Paddle的高层API。然后详细介绍每个模块包含的API。importpaddlefrompaddle.vision.transformsimportCompose,Normalizefrompaddle.vision.datasetsimportMNISTimportpaddle.nnasnn#数据预处理,归一化transform=Compose([Normalize(mean=[127.5],std=[127.5],data_format='CHW')])#数据加载,在训练集上应用数据预处理的操作模型网络mnist=nn.Sequential(nn.Flatten(),nn.Linear(784,512),nn.ReLU(),nn.Dropout(0.2),nn.Linear(512,10))#模型封装,用Model封装classmodel=paddle.Model(mnist)#模型配置:为模型训练做准备,设置优化器、损失函数和精度计算方法model.prepare(optimizer=paddle.optimizer.Adam(parameters=model.parameters()),loss=nn.CrossEntropyLoss(),metrics=paddle.metric.Accuracy())#modeltraining,model.fit(train_dataset,epochs=10,batch_size=64,verbose=1)#modelevaluation,模式l.evaluate(test_dataset,verbose=1)#Modelsave,model.save('model_path')从例子中可以看出,在数据预处理,数据加载,模型联网,模型训练,模型评估,模型保存等.1~3行代码就可以实现场景和高层API。与传统方法需要几十行代码相比,high-levelAPI只需要十几行代码就可以轻松完成一个MNIST分类器的实现。用很少的代码就可以达到和基本API一样的效果,大大降低了深度学习的学习门槛。如果是第一次学习深度学习框架,使用Paddle高级API,可以“凡尔赛”说“真烦人,Paddle高级API怎么开发这么快,我想写一个多几行代码!”High-levelAPI,How将以CV任务为例,简单介绍如何在不同场景下使用飞桨的高层API。本例完整代码可在AIStudio获取,无需准备任何软硬件环境即可直接在线运行代码,相当方便:https://aistudio.baidu.com/aistudio/projectdetail/12430851.数据预处理和数据加载对于数据加载,在一些典型的任务中,我们可以使用Paddle框架内置的数据集来完成数据加载。Paddle框架在paddle.vision.datasets目录下集成了常用的数据集作为领域API,包括MNIST、Cifar、Flowers等CV领域常用的数据集。在数据预处理场景中,FlyingPaddle框架提供了20多个常用的图像预处理API,方便我们快速实现数据增强,比如图像色调、对比度、饱和度、大小等各种数字图像处理方法。.图像预处理API集成在paddle.vision.transforms目录下,使用起来非常方便。您只需要先创建一个数据预处理转换,将所需的数据预处理方法存储在其中,然后在数据加载过程中将转换作为参数传递。另外,如果我们需要加载自己的数据集,可以使用paddle框架标准的数据定义和数据加载APIpaddle.io.Dataset和paddle.io.DataLoader,“一键式”完成数据集的定义和数据加载.下面是一个案例来展示如何使用Dataset来定义一个数据集。示例如下:frompaddle.ioimportDatasetclassMyDataset(Dataset):"""第一步:继承paddle.io.Dataset类"""def__init__(self):"""第二步:实现构造函数,定义数据读取方法,并划分训练和测试数据集"""super(MyDataset,self).__init__()self.data=[['traindata1','label1'],['traindata2','label2'],['traindata3','label3'],['traindata4','label4'],]def__getitem__(self,index):"""第三步:实现__getitem__方法,定义如何获取指定索引的Data,并返回单片ofdata(trainingdata,correspondinglabel)"""data=self.data[index][0]label=self.data[index][1]returndata,labeldef__len__(self):"""第四步:实现__len__方法并返回数据集总数"""returnlen(self.data)#测试定义数据集train_dataset=MyDataset()print('=============traindataset==============')fordata,labelintrain_dataset:print(data,label)我们只需要按照上面规范的四个步骤,我们已经实现了我们自己的数据集。然后,将train_dataset作为参数传入DataLoader,得到一个dataloader,完成训练数据的加载。【Tips:对于数据集的定义,Paddle框架同时支持map风格和iterable风格的数据集定义,只需要分别继承paddle.io.Dataset和paddle.io.IterableDataset即可。】2.网络构建在网络构建模块中。paddle高层API与基础API一致,统一使用paddle.nn下的API进行联网。paddle.nn目录包含所有模型联网相关的API,如卷积相关的Conv1D、Conv2D、Conv3D,循环神经网络相关的RNN、LSTM、GRU等。对于联网方式,FlyingPaddleFramework支持Sequential或SubClass用于模型构建。Sequential可以帮助我们快速构建线性网络结构,而SubClass则支持更丰富、更灵活的网络结构。我们可以根据实际使用场景选择最合适的组网方式。例如Sequential可以直接用于顺序线性网络结构,而对于一些更复杂的网络结构,我们使用SubClass来构建模型,在__init__构造函数中声明Layer,并在forward中使用声明的Layer变量进行前向求值。我们分别看一下Sequential和SubClass的例子。1.Sequential对于线性网络模型,我们只需要按照网络模型的结构顺序逐层添加到Sequential的后面即可。具体实现如下:#SequentialFormNetworkingmnist=nn.Sequential(nn.Flatten(),nn.Linear(784,512),nn.ReLU(),nn.Dropout(0.2),nn.Linear(512,10))2.SubClass使用SubClass进行联网的实现如下:#SubClass模式联网classMnist(nn.Layer):def__init__(self):super(Mnist,self).__init__()self.flatten=nn.Flatten()self.linear_1=nn.Linear(784,512)self.linear_2=nn.Linear(512,10)self.relu=nn.ReLU()self.dropout=nn.Dropout(0.2)defforward(self,inputs):y=self.flatten(inputs)y=self.linear_1(y)y=self.relu(y)y=self.dropout(y)y=self.linear_2(y)returny上述SubClass联网的结果是完全一致的与顺序网络的结果。可以明显看出使用SubClass组网会比使用Sequential复杂。然而,这带来的是网络模型结构的灵活性。我们可以设计不同的网络模型结构来应对不同的场景。3、飞桨框架内置模型除了自定义模型结构,飞桨框架还“贴心”的内置了很多模型,真正的一行代码实现了深度学习模型。目前Paddle框架内置的模型都是CV领域的模型,都在paddle.vision.models目录下,包括常见的vgg系列、resnet系列等模型。使用方法如下:mportpaddlefrompaddle.vision.modelsimportresnet18#方法一:一行代码直接使用resnetresnet=resnet18()#方法二:二次开发为骨干网classFaceNet(paddle.nn.Layer):def__init__(self,num_keypoints=15,pretrained=False:super(FaceNet,self).__init__()self.backbone=resnet18(pretrained)self.outLayer1=paddle.nn.Linear(1000,512)self.outLayer2=paddle.nn。Linear(512,num_keypoints*2)defforward(self,inputs):out=self.backbone(inputs)out=self.outLayer1(out)out=self.outLayer2(out)returnout3.模型可视化我们完成模型构建后,有时候我们需要将模型的网络结构和参数可视化,只要我们使用Model封装模型,然后调用model.summary实现网络模型的可视化,具体如下:mnist=nn.Sequential(nn.Flatten(),nn.Linear(784,512),nn.ReLU(),nn.Dropout(0.2),nn.Linear(512,10))#模型封装,用Model类封装model=paddle.Model(mnist)model.summary()输出结果如下:----------------------------------------------------------------------层(类型)InputShapeOutputShapeParam#===============================================================================Flatten-795[[32,1,28,28]][32,784]0Linear-5[[32,784]][32,512]401,920ReLU-3[[32,512]][32,512]0Dropout-3[[32,512]][32,512]0Linear-6[[32,512]][32,10]5,130=============================================================================总参数:407,050可训练参数:407,050不可训练参数:0-------------------------------------------------------------------------Inputsize(MB):0.10Forward/backwardpassize(MB):0.57Paramssize(MB):1.55EstimatedTotalSize(MB):2.22-----------------------------------------------------------------------------{'total_params':407050,'trainable_params':407050}Model.summary不仅会给出网络每一层的形状,还会给出网络每一层的参数和总的数量模型参数,非常方便直观的查看模型所有信息4.模型训练1.使用高级API在所有数据集上进行训练。过去经常困扰深度学习开发者的一个问题是模型训练的代码过于复杂,往往需要编写很多步骤才能让程序跑起来。冗长的代码使许多开发人员望而却步。现在Paddle的高层API封装了训练、评估、预测的API,可以直接使用Model.prepare(),Model.fit(),Model.evaluate(),Model.predict()完成模型训练,评估和预测。与传统框架相比,它往往需要大量的训练代码。使用Paddle高级API,3-5行即可完成模型的训练,大大简化了代码开发量,对初学开发者非常友好。具体代码如下:#用Model类将网络结构封装成模型model=paddle.Model(mnist)#准备模型训练,设置优化器、损失函数和精度计算方法model.prepare(optimizer=paddle.optimizer.Adam(parameters=model.parameters()),loss=paddle.nn.CrossEntropyLoss(),metrics=paddle.metric.Accuracy())#开始模型训练,指定训练数据集,设置训练轮数,设置每个dataset计算batchsize,设置log格式model.fit(train_dataset,epochs=10,batch_size=64,verbose=1)#开始模型评估,指定dataset,设置log格式model.evaluate(test_dataset,verbose=1)#开始模型测试并指定测试集Model.predict(test_dataset)2.使用高级API对一批数据集进行训练、验证和测试。有时我们需要按照batch对数据进行采样,然后完成模型的训练和验证,可以使用train_batch、eval_batch、predict_batch完成对一个batch的训练、验证和测试,如下:#模型封装,用Model类封装model=paddle.Model(mnist)#模型配置:准备模型训练,设置优化器、损失函数和精度计算方法model.prepare(optimizer=paddle.optimizer.Adam(parameters=model.parameters()),loss=nn.CrossEntropyLoss(),metrics=paddle.metric.Accuracy())#构建训练集数据加载器train_loader=paddle.io.DataLoader(train_dataset,batch_size=64,shuffle=True)#使用train_batch完成对batch_id的训练,datainenumerate(train_loader()):model.train_batch([data[0]],[data[1]])#构建测试集数据加载器test_loader=paddle.io.DataLoader(test_dataset,places=paddle.CPUPlace(),batch_size=64,shuffle=True)#使用eval_batch完成对batch_id的验证,datainenumerate(test_loader()):model.eval_batch([data[0]],[data[1]])#使用predict_batch完成对batch_id的预测,datainenumerate(test_loader()):model.predict_batch([data[0]])五、高层用法另外,高层API飞桨的也支持一些High-level的玩法,比如自定义Loss、自定义Metric、自定义Callback等。自定义Loss是指有时候我们会遇到框架现有Loss接口中不存在的特定任务的Loss计算方法,或者算法不符合如果你想满足自己的需求,那么期望能够自己定制Loss。自定义Metric的场景和自定义Loss是一样的。如果我们遇到一些想要实现个性化的操作,我们也可以通过框架来完成自定义的评价计算方式。CustomCallback可以帮助我们在训练的时候收集一些参数和数据。由于Model.fit()封装了训练过程,如果我们在训练过程中需要保存loss、metric等信息,就需要通过回调参数来收集这部分信息。更多更丰富的玩法,可扫描文末二维码获取~高阶API。下面以CV任务为例,介绍飞桨框架高层API的使用指南。未来,飞桨框架还计划推出专用于NLP领域的数据预处理模块,如填充数据、获取数据集词汇等;网络方面,也会实现NLP领域网络相关的API,比如网络相关的sequence_mask,评估指标相关的BLEU等;最后,对于NLP领域的artifacttransformer,我们也会进行针对性的优化;当这些功能上线后,我们会第一时间通知大家,敬请期待~高层API,在哪里看完飞桨高层API的使用介绍,是不是有想试试的冲动它?体验方式一:在线体验无需准备任何软硬件环境,直接访问以下地址,即可在线运行代码查看效果:https://aistudio.baidu.com/aistudio/projectdetail/1243085体验方法二:本地体验如果您还想在本地电脑上体验,需要确保您的本地电脑上已经成功安装了PaddleOpenSourceFramework2.0。下面介绍飞桨开源框架2.0的安装方法。可以参考下面的命令直接用pip安装。安装后,您可以开始使用高级API。#CPU版本#CPU版本$pip3installpaddlepaddle==2.0.0rc0-ihttps://mirror.baidu.com/pypi/simple#GPU版本$pip3installpaddlepaddle_gpu==2.0.0rc0-ihttps://mirror.baidu.com/pypi/简单的
