PaddlePaddle介绍
PaddlePaddle是百度自主研发的集深度学习核心框架、工具组件和服务平台为一体的技术领先、功能完备的开源深度学习平台,有全面的官方支持的工业级应用模型,涵盖自然语言处理、计算机视觉、推荐引擎等多个领域,并开放多个预训练中文模型。
PaddlePaddle同时支持稠密参数和稀疏参数场景的大规模深度学习并行训练,支持千亿规模参数、数百个节点的高效并行训练。PaddlePaddle拥有多端部署能力,支持服务器端、移动端等多种异构硬件设备的高速推理,预测性能有显著优势。目前PaddlePaddle已经实现了API的稳定和向后兼容,具有完善的中英双语使用文档。
PaddlePaddle的使用
PaddlePaddle是一个开源的深度学习平台,而在我们进行使用的时候主要使用的是其核心框架Paddle Fluid。Paddle Fluid提供覆盖深度学习开发、训练、预测及部署全流程的服务。
和其他我们常用的深度学习框架一样,Fluid同样使用Tensor结构来承载数据。
Tensor的示例可以如下来表示:
用图片来表示一下1-6维的Tensor:
Fluid目前支持的数据类型如下(截止到2019.6):
float16: 部分操作支持
float32: 主要实数类型
float64: 次要实数类型,支持大部分操作
int32: 次要标签类型
int64: 主要标签类型
uint64: 次要标签类型
bool: 控制流数据类型
int16: 次要标签类型
uint8: 输入数据类型,可用于图像像素
Fluid中存在三种特殊的Tensor:
1、模型中的可学习参数
深度学习中可学习的参数(包括网络权值、偏置等)。该类参数在整个训练过程中会不断的接受优化算法的更新。
参数的定义如下(其中name用来表示名称,shape用来表示维度,dtype用来表示数据类型):
w = fluid.layers.create_parameter(name='w',shape=[1],dtype='float32')
通常情况下,我们并不需要自己来创建网络中的可学习参数,Fluid为大部分常见的神经网络基本计算模块都提供了封装。
以全连接模型为示例,Fluid会直接为全连接层创建权值和偏置两个可学习参数,此时我们并不需要像上面一样调用Parameter接口。
y = fluid.layers.fc(input=x,size=128,bias_attr=True)
2、输入输出Tensor
神经网络中输入输出数据也可以看做是一个特殊的Tensor,在这个Tensor中,一些维度的大小在定义模型时无法确定(如batch size,图片的宽度高度等),这些数据在我们定义模型时就需要进行占位。
batch size的定义:一次训练所选取的样本数(选取适当,会有效的防止内存爆炸 )。
Fluid中使用Fluid.layers.data来接收输入数据,我们需要提供形状信息,无法确定的时候可以指定维度为None。
代码示例:
# 定义名称为x,第一维度为3,数据类型为float64的数据 x = fluid.layers.data(name="x", shape=[3, None], dtype="float64") # batch size无需显示指定,paddle会自动补充0维度为batch size,并且在运行时填充正确的数值 a = fluid.layers.data(name="a", shape=[3, 4], dtype='int64') # 假如在我们熟知的卷积神经网络中图片的宽、高会不断的发生变化,我们可以有如下的定义方法 b = fluid.layers.data(name="image", shape=[3, None, None], dtype="float32")
3、常量Tensor
Fluid通过fill_constant接口来实现常量Tensor,我们可以指定维度、数据类型、常量值。
data = fluid.layers.fill_constant(shape=[1], dtype="int64", value=3)
注:和其他的框架一样,我们所定义的Tensor是不具有具体值的,知识定义了一个需要执行的操作,后文中会讲到如何运行Tensor。
数据传入
上面一部分我们只说了如何定义数据却没有明确指出如何传入数据,我们定义好数据后需要使用fluid.Executor或者fluid.ParallelExecutor接口来传入数据,Executor发挥着类似于解释器(类似于tf中的session)的作用:
# 创建CPU使用 place = fluid.CPUPlace() # 创建调试器 output = fluid.Executor(place) # 初始化调试器 output.run(fluid.default_main_program())
数据操作
Fluid中使用OP(Operator)来表示对数据的操作,我们可以使用内置指令来描述他们的神经网络。
在Python中,Fluid中的OP被封装在paddle.fluid.layers,paddle.fluid.nets等模块中。
举个例子魔门可以用paddle.fluid.layers.elementwise_add()实现两个输入Tensor的加法运算:
#定义网络 import paddle.fluid as fluid a = fluid.layers.data(name="a",shape=[1],dtype='float32') b = fluid.layers.data(name="b",shape=[1],dtype='float32') result = fluid.layers.elementwise_add(a,b) #定义Exector cpu = fluid.CPUPlace() #定义运算场所,这里选择在CPU下训练 exe = fluid.Executor(cpu) #创建执行器 exe.run(fluid.default_startup_program()) #网络参数初始化 #准备数据 import numpy data_1 = int(input("Please enter an integer: a=")) data_2 = int(input("Please enter an integer: b=")) x = numpy.array([[data_1]]) y = numpy.array([[data_2]]) #执行计算 outs = exe.run( feed={'a':x,'b':y}, fetch_list=[result.name]) #验证结果 print ("%d+%d=%d" % (data_1,data_2,outs[0][0]))
输出如下:
我们如果要获取网络执行过程中a,b的值,可以将a,b添加到fetch_list中:fetch_list=[a,b,result.name]
本文就讲述了Fluid的一些基本操作,后续会深入理解高级操作。