声明:本文图片来源于百度AI开放平台。
PaddlePaddle架构
Tensor
在神经网络中传递的数据都是Tensor。Tensor可以简单理解成一个多维数组,一般而言可以有任意多的维度。 不同的Tensor可以具有自己的数据类型和形状,同一Tensor中每个元素的数据类型是一样的,Tensor的形状就是Tensor的维度。
下图直观地表示1~6维的Tensor:
Layer
Layer表示一个独立计算的逻辑,layer通常包舍一个或多个operator, layers.relu
表示relu计算, layers.pool 2d
表示pool操作。Layer有Varicble输入和输出。Layer的调用示例:
output=fluicd.layers.relu(x)
Variable
Variable表示一个变量,变量可以是一个张量Tensor,也可以是其他类型。Variable讲入Layert算,然后Layer返回Variable。Variable的创建示例:
var=fluicd.layers.fill_constant(shape=[1], dtype='int64', value=5)
Operator
在飞桨(PaddlePaddle,以下简称Paddle)中,所有对数据的操作都由Operator表示。为了便于用户使用,Paddle中的Operator被封装入 paddle.fluid.layers
, paddle.fluid.nets
等模块。
Program
Program包含Variable定义的多个变量和Layer定义的多个计算。Procram从用户角度是顺序执行的。
Executor
Executor用来执行Procgram。Executor会一次性执行Procram中定义的所有计算。可以通过feed来提供Procgrcam输入数据,通过fetch_list来获取输出数据。
Place
Paddle可以运行在Intel CPU,Nvidia GPU,ARM CPU和更多嵌入式设备上。训练是可以通过Place来指定执行的设备。指定GPU示例:
place=fluid.CUDAPlace(0)
CompiledProgram
- Program可以转换成一个有向无环图,经过一系列的优化,生成一个执行的图
CompiledProgram.with_data_parallel
,生成一个可以多卡并发的训练图CompiledProgram.with_optimized_inference
,生成一个优化后的预测图- 编译后的program可以通讨Executor执行:
Executor.run(compiled_program)
feed/fetch_list
feed用来给模型的输入提供数据。fetch_list用来获取模型执行的中间结果。
静态图与动态图
飞桨支持两种深度学习建模编写方式,更方便调试的动态图模式和性能更好并便于部署的静态图模式。
- 静态图模式(声明式编程范式,类比C++):先编译后执行的方式。用户需预先定义完整的网络结构,再对网络结构进行编译优化后,才能执行获得计算结果。
- 动态图模式(命令式编程范式,类比Python):解析式的执行方式。用户无需预先定义完整的网络结构,每写一行网络代码,即可同时获得计算结果。
示例:计算常量的加法:1+1
from paddle import fluid
# 定义两个张量
x1 = fluid.layers.fill_constant(shape=[2, 2], value=1, dtype='int64')
x2 = fluid.layers.fill_constant(shape=[2, 2], value=1, dtype='int64')
y = x1 + x2
# 创建一个使用CPU的解释器
place = fluid.CPUPlace()
exe = fluid.executor.Executor(place)
# 进行运算,并把y的结果输出
result = exe.run(program=fluid.default_main_program(),
fetch_list=[y])
print(result)
输出:
[array([[2, 2],
[2, 2]], dtype=int64)]
示例:计算变量的加法:1+1
import paddle.fluid as fluid
import numpy as np
# 定义两个张量
a = fluid.layers.create_tensor(dtype='int64', name='a')
b = fluid.layers.create_tensor(dtype='int64', name='b')
# 将两个张量求和
y = fluid.layers.sum(x=[a, b])
# 创建一个使用CPU的解释器
place = fluid.CPUPlace()
exe = fluid.executor.Executor(place)
# 定义两个要计算的变量
a1 = np.array([3, 2]).astype('int64')
b1 = np.array([1, 1]).astype('int64')
# 进行运算,并把y的结果输出
out_a, out_b, result = exe.run(program=fluid.default_main_program(),
feed={'a': a1, 'b': b1},
fetch_list=[a, b, y])
print(out_a, " + ", out_b," = ", result)
输出:
[3 2] + [1 1] = [4 3]