数学操作

Paddle提供了丰富的数学操作,以下列出的数学操作都是对目标张量进行逐元素的操作。其中,如果二元操作的两个输入有不同形状,会先进行 broadcast. 部分数学操作还支持数学操作符,比如: +, -, *, / 等。数学操作符不仅支持张量,还支持标量。

一元操作

  • exp 对输入 Tensor 逐元素做 exp 操作。
  • tanh 对输入 Tensor 逐元素取正切。
  • sqrt 对输入 Tensor 逐元素取平方根。
  • abs 对输入 Tensor 逐元素取绝对值。
  • ceil 对输入 Tensor 逐元素向上取整。
  • floor 对输入 Tensor 逐元素向下取整。
  • sin 对输入 Tensor 逐元素取正弦。
  • cos 对输入 Tensor 逐元素取余弦。
  • round 对输入 Tensor 逐元素四舍五入取整。
  • square 对输入 Tensor 逐元素取平方。
  • reciprocal 对输入 Tensor 逐元素取倒数。
  • reduce 对输入 Tensor 在指定的若干轴上做reduce操作,包括:reduce_min reduce_max reduce_sum reduce_mean reduce_prod

    二元操作

  • elementwise_add 对两个 Tensor 逐元素相加,对应的数学操作符为 +

  • elementwise_sub 对两个 Tensor 逐元素相减,对应数学操作符 -
  • elementwise_mul 对两个 Tensor 逐元素相乘, 对应数学操作符 *
  • elementwise_div 对两个 Tensor 逐元素相除, 对应数学操作符 ///
  • elementwise_pow 对两个 Tensor 逐元素做次幂操作, 对应数学操作符 **
  • equal 对两个 Tensor 逐元素判断是否相等, 对应数学操作符 ==
  • less_than 对两个 Tensor 逐元素判断是否满足小于关系, 对应数学操作符 <
  • sum 对两个 Tensor 逐元素相加。
  • elementwise_min 对两个 Tensor 逐元素进行 min(x, y) 操作。
  • elementwise_max 对两个 Tensor 逐元素进行 max(x, y) 操作。
  • matmul 对两个 Tensor 进行矩阵乘操作。

batch

该接口是一个reader的装饰器。返回的reader将输入reader的数据打包成指定的batch_size大小的批处理数据。

接口定义:

  1. paddle.batch(reader, batch_size, drop_last=False)
  2. # or
  3. paddle.fluid.io.batch(reader, batch_size, drop_last=False)

示例:

  1. def reader():
  2. for i in range(10):
  3. yield i
  4. batch_reader = paddle.batch(reader, batch_size=2)
  5. # batch_reader = fluid.io.batch(reader, batch_size=2)
  6. for data in batch_reader():
  7. print(data)

输出:

  1. [0, 1]
  2. [2, 3]
  3. [4, 5]
  4. [6, 7]
  5. [8, 9]

参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/io_cn/batch_cn.html

reshape

该OP在保持输入 x 数据不变的情况下,改变 x 的形状。
目标形状可由 shape 给出。 shape 只能是整数列表或元组,且在编译时仍然应该正确地设置 shape 以保证形状推断。

接口定义:

  1. paddle.fluid.layers.reshape(x, shape, act=None, inplace=False, name=None)

参数解释:

  • x (Variable)- 多维 TensorLoDTensor,数据类型为 float32float64int32,或 int64
  • shape (list|tuple|Variable)- 数据类型是 int32 。定义目标形状。目标形状最多只能有一个维度为-1。如果 shape 的类型是 list 或 tuple, 它的元素可以是整数或者形状为[1]的 TensorLoDTensor。如果 shape 的类型是 Variable,则是1-D的 TensorLoDTensor
  • actual_shape (Variable,可选)- 1-D TensorLoDTensor,默认值:None。如果 actual_shape 被提供,actual_shape 具有比 shape 更高的优先级,此时 shape 只能是整数列表或元组。更新提示:actual_shape 在未来的版本中将被舍弃,并用 shape 代替。
  • act (str,可选)- 对形状改变后的输入变量做非线性激活操作,激活函数类型可以参考 激活函数 。默认值: None
  • inplace (bool,可选)- 如果 inplaceTrue,则 layers.reshape 的输入和输出是同一个变量,否则 layers.reshape 的输入和输出是不同的变量。默认值:False。请注意,如果 x 是多个OP的输入,则 inplace 必须为False。
  • name (str,可选)- 具体用法请参见 Name ,一般无需设置。默认值: None

在指定目标shape时存在一些技巧:

  • -1 表示这个维度的值是从x的元素总数和剩余维度推断出来的。因此,有且只有一个维度可以被设置为-1。
  • 0 表示实际的维数是从x的对应维数中复制出来的,因此shape中0的索引值不能超过x的维度。

一些例子:

  1. 给定一个形状为[2,4,6]的三维张量x,目标形状为[6,8],则将x变换为形状为[6,8]的2-D张量,且x的数据保持不变。
  2. 给定一个形状为[2,4,6]的三维张量x,目标形状为[2,3,-1,2],则将x变换为形状为[2,3,4,2]的4-D张量,且x的数据保持不变。在这种情况下,目标形状的一个维度被设置为-1,这个维度的值是从x的元素总数和剩余维度推断出来的。
  3. 给定一个形状为[2,4,6]的三维张量x,目标形状为[-1,0,3,2],则将x变换为形状为[2,4,3,2]的4-D张量,且x的数据保持不变。在这种情况下,0对应位置的维度值将从x的对应维数中复制,-1对应位置的维度值由x的元素总数和剩余维度推断出来。

示例1:

  1. data_1 = fluid.data(name='data_1', shape=[2, 4, 6], dtype='float32')
  2. reshaped_1 = fluid.layers.reshape(x=data_1, shape=[-1, 0, 3, 2], inplace=False)
  3. print(data_1) # shape: [2, 4, 6]
  4. print(reshaped_1) # shape: [2, 4, 3, 2]

示例2:

  1. data_2 = fluid.layers.fill_constant([2,25], "int32", 3)
  2. dim = fluid.layers.fill_constant([1], "int32", 5)
  3. reshaped_2 = fluid.layers.reshape(data_2, shape=[dim, 10])
  4. print(data_2) # shape: [2,25]
  5. print(reshaped_2) # shape: [5,10]