本文为作者对官方文档的解读+自己在平时开发练习中的一些总结,但总得一切以官方为准
深度学习中第一大问题就是用于计算模型的数据量实在是过于庞大,且类型复杂。如果只用一般的列表、数组、向量这样的数据结构进行计算的话,肯定是不行的。因此在深度学习中,主流的学习框架一般用Tensor(张量)来表示数据,这是一个不定维度的多维数组。
在Paddlepaddle中,Tensor类型被返回为类型名为Variable的变量。一般来说,二者是一个概念
data()方法就是用于创建tensor(variable)的方法。
data()方法在PaddlePaddle下有两处接口,在开发中基本用法一致。
先看下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()方法可能存在一定的安全隐患,因此不推荐从这里引用
再看下fluid下的data()
作用和layers下的一致,在参数设定上稍有不同
在此需要补充的是,只有新版本的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(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()将其转化为张量。
另外,一切以官方文档及版本更新为主。