首页 > 技术文章 > paddle1.8-官方文档1-快速上手(1)-基本概念

NSEW 2021-05-31 09:57 原文

paddle1.8-官方文档1-快速上手(1)-基本概念

paddle1.8-官方文档1-快速上手(1)-基本概念 目录划分  
一、基本概念: 
  1.1 编程指南  
  1.2 Variable
  1.3 Tensor
  1.4 LoDTensor
  1.5 Operator
  1.6 Program
  1.7 Executor
  1.8 命令式编程使用教程

壹、基本概念

一、编程指南

学习: 
  1. 如何表示和定义数据变量。 
  2.如何完整组建一个深度学习网络 并进行训练。

① 数据的表示和定义

paddle使用 tensor 承载数据,包括: 模型中的可学习参数(如 网络权重、偏置等),网络中每一层 输入、输出数据,常量数据。

  • paddle中使用 fluid.data 创建数据变量,fluid.data 需要指定 Tensor 的形状信息 和 数据类型,当遇到无法确定的维度时,可以将相应维度指定为 None,如下:
import paddle.fluid as fluid  

# 定义一个数据类型 int64 的二维数据变量X,X的第一维的维度为3,第二个维度未知,要在程序执行过程中 才能确定,因此X的形状 可以指定为 【3, None】
x = fluid.data(name="x", shape=[3, None],  dtype="int64")

# 大多数网络都会采用 batch 方式进行数据组织, batch 大小在定义时不确定,因此 batch 所在维度(通常时第一维)可以指定 None
batched_x = fluid.data(name="", shape=[None, 3, None], dtype="int64")
  • 除 fluid.data 之外,还可以使用 fluid.layers.fill_constant 来创建常量,如下 代码将创建一个 维度为 【3, 4】,数据类型为 int64 的 Tensor,期中所有元素值均为16.
import paddle.fluid as fluid
data = fluid.layers.fill_constant(shape=[3, 4], value=16, dtype="int64")

*需要注意的是: 在声明式编程模型方式中,上述定义的 Tensor 并不具有值(即使创建常量的时候指定了 Value),他们仅代表将要执行的操作,在网络执行时(训练或预测)才会进行真正的赋值操作,比如打印上述代码中的data 将会得到对其信息的描述:

print(data) 
输出结果: 
  name: "fill_constant_0.tmp_0"
  type {
      type: LOD_TENSOR
      lod_tensor {
          tensor {
              data_type: INT64
              dims: 3
              dims: 4
          }
      }
  }
  persistable: false
  • 在网络执行过程中,获取 Tensor 数值有两种方式:
    • 方式一是利用 paddle.fluid.layers.Print 创建一个打印操作,打印正在访问的 Tensor
      方式一的代码实现如下所示:
      import paddle.fluid as fluid
      
      data = fluid.layers.fill_constant(shape=[3, 4], value=16, dtype='int64')
      data = fluid.layers.Print(data, message="Print data:")
      
      place = fluid.CPUPlace()
      exe = fluid.Executor(place)
      exe.run(fluid.default_startup_program())
      
      ret = exe.run()
      
      运行时输出结果:
      1571742368    Print data:    The place is:CPUPlace
      Tensor[fill_constant_0.tmp_0]
          shape: [3,4,]
          dtype: x
          data: 16,16,16,16,16,16,16,16,16,16,16,16,
      
    • 方式二是将Variable添加在 fetch_list 中

② 数据读取

使用 fluid.data 创建数据变量之后,需要把网络执行所需要的数据读取到对应变量中,具体数据准备,参考Paddle静态图、动态图数据准备

③ 组建网络

在Paddle中,数据计算类API统一称为Operator(算子),简称OP,大多数OP在 paddle.fluid.layers 模块中提供。
例如用户可以利用 paddle.fluid.layers.elementwise_add() 实现两个输入Tensor的加法运算:

# 定义变量 
import paddle.fluid as fluid
a = fluid.data(name="a", shape=[None,1], dtype="int64")
b = fluid.data(name="b", shape=[None,1], dtype="int64")

# 组建网络
result = fluid.layers.elementwise_add(a, b)

# 准备运行网络 
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}        # 将输入数据x,y 分别赋值给变量 a, b
      fetch_list = [result]        # 通过 fetch_list 参数指定需要获取的变量结果
  )

# 输出计算结果
print(data_1, data_2, outs[0][0])

④ 组建更加复杂的网络

⑤ 一个完整的网络示例

⑥ 进一步学习

二、Variable

三、Tensor

四、LoDTensor

五、Operator

六、Program

七、Executor

八、命令式编程使用教程(动态图)

贰、编程实践

推荐阅读