【PaddlePaddle】data()使用及分析

【PaddlePaddle】data()分析及使用

文章目录

  • 【PaddlePaddle】data()分析及使用
    • 官方文档
    • 背景&简介
      • layers
        • 参数解释
      • fluid
    • 示例
    • 补充:对Tensor赋值
    • 总结

官方文档

本文为作者对官方文档的解读+自己在平时开发练习中的一些总结,但总得一切以官方为准

背景&简介

深度学习中第一大问题就是用于计算模型的数据量实在是过于庞大,且类型复杂。如果只用一般的列表、数组、向量这样的数据结构进行计算的话,肯定是不行的。因此在深度学习中,主流的学习框架一般用Tensor(张量)来表示数据,这是一个不定维度的多维数组。
在Paddlepaddle中,Tensor类型被返回为类型名为Variable的变量。一般来说,二者是一个概念
data()方法就是用于创建tensor(variable)的方法。
data()方法在PaddlePaddle下有两处接口,在开发中基本用法一致。

layers

先看下layers下的data()

paddle.fluid.layers.data(name, shape, append_batch_size=True, dtype='float32', lod_level=0, type=VarType.LOD_TENSOR, stop_gradient=True)

(一直不知道为什么Python的许多库不可以像Java一样在IDE中查看UML图)
data是layers类中的一个成员方法,主要作用是构建一个类型为Variable的算子,该算子在计算图中是一个全局变量。
但同时,请注意官方文档中有如下说明:
不推荐使用 paddle.fluid.layers.data ,因其在之后的版本中会被删除。请使用 paddle.fluid.data 。
paddle.fluid.layers.data 在组网期间会设置创建的变量维度(shape)和数据类型(dtype),但不会检查输入数据的维度和数据类型是否符合要求。 paddle.fluid.data 会在运行过程中由Executor/ParallelExecutor检查输入数据的维度。

也就是说,在layers类中的data()方法可能存在一定的安全隐患,因此不推荐从这里引用

参数解释

  • name (str)- 被创建的变量的名字 。
  • shape (list)- 声明维度信息的list。如果 append_batch_size 为True且内部没有维度值为-1,则应将其视为每个样本的形状。 否则,应将其视为batch数据的形状。
  • append_batch_size (bool)
    • 1.如果为True,则在维度(shape)的开头插入-1。 例如,如果shape=[1],则输出shape为[-1,1]。可用于设置运行期间不同batch大小。
    • 2.如果维度(shape)包含-1,比如shape=[-1,1]。 append_batch_size会强制变为为False(表示无效),因为PaddlePaddle不能在shape上设置一个以上的未知数。
  • dtype (np.dtype|VarType|str)- 数据类型,支持bool,float16,float32,float64,int8,int16,int32,int64,uint8(机器学习中一般用float32)。
  • type (VarType)- 输出类型,支持VarType.LOD_TENSOR,VarType.SELECTED_ROWS,VarType.NCCL_ID。默认为VarType.LOD_TENSOR。
  • lod_level (int)- LoD层。0表示输入数据不是一个序列。默认值为0。
  • stop_gradient (bool)- 提示是否应该停止计算梯度,默认值为True。
  • 返回:全局变量,可进行数据访问
  • 返回类型:Variable(Tensor张量)

再看下fluid下的data()

fluid

作用和layers下的一致,在参数设定上稍有不同

  • name (str)- 被创建的变量的名字,具体用法请参见 Name 。
  • shape (list|tuple)- 声明维度信息的list或tuple。
  • dtype (np.dtype|VarType|str,可选)- 数据类型,支持bool,float16,float32,float64,int8,int16,int32,int64,uint8。默认值为float32。
  • lod_level (int,可选)- LoDTensor变量的LoD level数,LoD level是PaddlePaddle的高级特性,一般任务中不会需要更改此默认值,关于LoD level的详细适用场景和用法请见 LoDTensor 。默认值为0。

示例

在此需要补充的是,只有新版本的Paddlepaddle才能在fulid下直接使用data()方法,笔者的电脑中paddlepaddle版本为1.5.1,有点低了,因此就存在这一问题

import paddle.fluid as fluid
data = fluid.layers.data(name='test', shape=[5], dtype='float32')
print(type(data)) #

再如

# 用data作算子做一个简单的损失函数计算
import paddle.fluid as fluid
x = fluid.layers.data(name='x', shape=[1, 3, 5, 7, 9], dtype='float32')
x_predict = fluid.layers.data(name='x_predict', shape=[2, 4, 6, 7, 8])
result = fluid.layers.square_error_cost(x,x_predict)
print(result) # 输出的是维度信息

输出

name: "square_error_cost_0.tmp_1"
type {
  type: LOD_TENSOR
  lod_tensor {
    tensor {
      data_type: FP32
      dims: -1
      dims: 1
      dims: 3
      dims: 5
      dims: 7
      dims: 9
    }
    lod_level: 0
  }
}
persistable: false

<class 'paddle.fluid.framework.Variable'>

补充:对Tensor赋值

那么有一个问题来了:我作好了对Tensor(Variable)的定义,那么我该怎么进行赋值呢?
Paddlepaddle官方曾解答过这一问题
“Fluid中,为Variable赋值的方法如下,主要逻辑就fluid.global_scope().find_var()找到模型结构中对应节点,然后通过get_tensor()方法获得对应的tensor对象,接着就可以使用set()方法对其进行赋值。”
fluid.global_scope()本身作用是获取类型为Scope的全局/默认作用域实例。
find_val()起到找对应节点的作用。
例如下面的代码段:

import paddle.fluid as fluid
import numpy as np
List_1 = [1, 5, 9, 13, 17]
arr = np.array(List_1, dtype='int')
fluid.global_scope().var("data").get_tensor().set(arr, fluid.CPUPlace())
data = np.array(fluid.global_scope().find_var("data").get_tensor())
print(data)# [ 1  5  9 13 17]

最终返回了ndarray类型的一个向量

总结

深度学习中最常用的数据结构是Tensor,在paddlepaddle中也叫Variable,用data()方法来初始化这一算子的各种属性。
对于Tensor的赋值要先在数组中找对应节点,再用get_tensor()将其转化为张量。
另外,一切以官方文档及版本更新为主

你可能感兴趣的:(深度学习,机器学习,PaddlePaddle)