PaddlePaddle是百度自主研发的集深度学习核心框架、工具组件和服务平台为一体的技术领先、功能完备的开源深度学习平台,有全面的官方支持的工业级应用模型,涵盖自然语言处理、计算机视觉、推荐引擎等多个领域,并开放多个预训练中文模型。
PaddlePaddle同时支持稠密参数和稀疏参数场景的大规模深度学习并行训练,支持千亿规模参数、数百个节点的高效并行训练。PaddlePaddle拥有多端部署能力,支持服务器端、移动端等多种异构硬件设备的高速推理,预测性能有显著优势。目前PaddlePaddle已经实现了API的稳定和向后兼容,具有完善的中英双语使用文档。
PaddlePaddle是一个开源的深度学习平台,而在我们进行使用的时候主要使用的是其核心框架Paddle Fluid。Paddle Fluid提供覆盖深度学习开发、训练、预测及部署全流程的服务。
和其他我们常用的深度学习框架一样,Fluid同样使用Tensor结构来承载数据。
Tensor的示例可以如下来表示:
阶 | 数学实例 | 实例表示 |
0 | 常数(只有大小) | s = 123 |
1 | 向量(有大小和方向) | v = [1.2,1.3,1.4] |
2 | 矩阵 | m = [[1,2,3],[4,5,6]] |
3 | 三阶张量 | t = [[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]] |
n | n阶张量 | 以此类推...... |
用图片来表示一下1-6维的Tensor:
Fluid目前支持的数据类型如下(截止到2019.6):
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的一些基本操作,后续会深入理解高级操作。