声明:本文图片来源于百度AI开放平台

PaddlePaddle架构

📃 PaddlePaddle基础概念 - 图1

Tensor

在神经网络中传递的数据都是Tensor。Tensor可以简单理解成一个多维数组,一般而言可以有任意多的维度。 不同的Tensor可以具有自己的数据类型和形状,同一Tensor中每个元素的数据类型是一样的,Tensor的形状就是Tensor的维度。

下图直观地表示1~6维的Tensor:
📃 PaddlePaddle基础概念 - 图2

Layer

Layer表示一个独立计算的逻辑,layer通常包舍一个或多个operator, layers.relu 表示relu计算, layers.pool 2d 表示pool操作。Layer有Varicble输入和输出。Layer的调用示例:

  1. output=fluicd.layers.relu(x)

Variable

Variable表示一个变量,变量可以是一个张量Tensor,也可以是其他类型。Variable讲入Layert算,然后Layer返回Variable。Variable的创建示例:

  1. var=fluicd.layers.fill_constant(shape=[1], dtype='int64', value=5)

Operator

在飞桨(PaddlePaddle,以下简称Paddle)中,所有对数据的操作都由Operator表示。为了便于用户使用,Paddle中的Operator被封装入 paddle.fluid.layerspaddle.fluid.nets 等模块。

Program

Program包含Variable定义的多个变量和Layer定义的多个计算。Procram从用户角度是顺序执行的。
📃 PaddlePaddle基础概念 - 图3

Executor

Executor用来执行Procgram。Executor会一次性执行Procram中定义的所有计算。可以通过feed来提供Procgrcam输入数据,通过fetch_list来获取输出数据。

Place

Paddle可以运行在Intel CPU,Nvidia GPU,ARM CPU和更多嵌入式设备上。训练是可以通过Place来指定执行的设备。指定GPU示例:

  1. 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

  1. from paddle import fluid
  2. # 定义两个张量
  3. x1 = fluid.layers.fill_constant(shape=[2, 2], value=1, dtype='int64')
  4. x2 = fluid.layers.fill_constant(shape=[2, 2], value=1, dtype='int64')
  5. y = x1 + x2
  6. # 创建一个使用CPU的解释器
  7. place = fluid.CPUPlace()
  8. exe = fluid.executor.Executor(place)
  9. # 进行运算,并把y的结果输出
  10. result = exe.run(program=fluid.default_main_program(),
  11. fetch_list=[y])
  12. print(result)

输出:

  1. [array([[2, 2],
  2. [2, 2]], dtype=int64)]

示例:计算变量的加法:1+1

  1. import paddle.fluid as fluid
  2. import numpy as np
  3. # 定义两个张量
  4. a = fluid.layers.create_tensor(dtype='int64', name='a')
  5. b = fluid.layers.create_tensor(dtype='int64', name='b')
  6. # 将两个张量求和
  7. y = fluid.layers.sum(x=[a, b])
  8. # 创建一个使用CPU的解释器
  9. place = fluid.CPUPlace()
  10. exe = fluid.executor.Executor(place)
  11. # 定义两个要计算的变量
  12. a1 = np.array([3, 2]).astype('int64')
  13. b1 = np.array([1, 1]).astype('int64')
  14. # 进行运算,并把y的结果输出
  15. out_a, out_b, result = exe.run(program=fluid.default_main_program(),
  16. feed={'a': a1, 'b': b1},
  17. fetch_list=[a, b, y])
  18. print(out_a, " + ", out_b," = ", result)

输出:

  1. [3 2] + [1 1] = [4 3]