数学操作
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大小的批处理数据。
接口定义:
paddle.batch(reader, batch_size, drop_last=False)
# or
paddle.fluid.io.batch(reader, batch_size, drop_last=False)
示例:
def reader():
for i in range(10):
yield i
batch_reader = paddle.batch(reader, batch_size=2)
# batch_reader = fluid.io.batch(reader, batch_size=2)
for data in batch_reader():
print(data)
输出:
[0, 1]
[2, 3]
[4, 5]
[6, 7]
[8, 9]
参考:https://www.paddlepaddle.org.cn/documentation/docs/zh/api_cn/io_cn/batch_cn.html
reshape
该OP在保持输入 x
数据不变的情况下,改变 x
的形状。
目标形状可由 shape
给出。 shape
只能是整数列表或元组,且在编译时仍然应该正确地设置 shape
以保证形状推断。
接口定义:
paddle.fluid.layers.reshape(x, shape, act=None, inplace=False, name=None)
参数解释:
- x (Variable)- 多维
Tensor
或LoDTensor
,数据类型为float32
,float64
,int32
,或int64
。 - shape (list|tuple|Variable)- 数据类型是
int32
。定义目标形状。目标形状最多只能有一个维度为-1。如果shape
的类型是 list 或 tuple, 它的元素可以是整数或者形状为[1]的Tensor
或LoDTensor
。如果shape
的类型是Variable
,则是1-D的Tensor
或LoDTensor
。 - actual_shape (Variable,可选)- 1-D
Tensor
或LoDTensor
,默认值:None。如果actual_shape
被提供,actual_shape
具有比shape
更高的优先级,此时shape
只能是整数列表或元组。更新提示:actual_shape
在未来的版本中将被舍弃,并用shape
代替。 - act (str,可选)- 对形状改变后的输入变量做非线性激活操作,激活函数类型可以参考 激活函数 。默认值:
None
。 - inplace (bool,可选)- 如果
inplace
为True
,则layers.reshape
的输入和输出是同一个变量,否则layers.reshape
的输入和输出是不同的变量。默认值:False
。请注意,如果x
是多个OP的输入,则inplace
必须为False。 - name (str,可选)- 具体用法请参见 Name ,一般无需设置。默认值:
None
。
在指定目标shape时存在一些技巧:
-1
表示这个维度的值是从x的元素总数和剩余维度推断出来的。因此,有且只有一个维度可以被设置为-1。0
表示实际的维数是从x的对应维数中复制出来的,因此shape中0的索引值不能超过x的维度。
一些例子:
- 给定一个形状为[2,4,6]的三维张量x,目标形状为[6,8],则将x变换为形状为[6,8]的2-D张量,且x的数据保持不变。
- 给定一个形状为[2,4,6]的三维张量x,目标形状为[2,3,-1,2],则将x变换为形状为[2,3,4,2]的4-D张量,且x的数据保持不变。在这种情况下,目标形状的一个维度被设置为-1,这个维度的值是从x的元素总数和剩余维度推断出来的。
- 给定一个形状为[2,4,6]的三维张量x,目标形状为[-1,0,3,2],则将x变换为形状为[2,4,3,2]的4-D张量,且x的数据保持不变。在这种情况下,0对应位置的维度值将从x的对应维数中复制,-1对应位置的维度值由x的元素总数和剩余维度推断出来。
示例1:
data_1 = fluid.data(name='data_1', shape=[2, 4, 6], dtype='float32')
reshaped_1 = fluid.layers.reshape(x=data_1, shape=[-1, 0, 3, 2], inplace=False)
print(data_1) # shape: [2, 4, 6]
print(reshaped_1) # shape: [2, 4, 3, 2]
示例2:
data_2 = fluid.layers.fill_constant([2,25], "int32", 3)
dim = fluid.layers.fill_constant([1], "int32", 5)
reshaped_2 = fluid.layers.reshape(data_2, shape=[dim, 10])
print(data_2) # shape: [2,25]
print(reshaped_2) # shape: [5,10]