很久没有更新paddle系列了,十月实在有些忙(写各种本子、做各种作业、忙一些投稿),十一月忙完之后会稳步更新。
数学运算
逐元素操作
除了基本算术操作中提到的六种逐元素操作外,还有11种逐元素操作,但是使用的可能并没有那么频繁:
x.abs() #逐元素取绝对值
x.ceil() #逐元素向上取整
x.floor() #逐元素向下取整
x.round() #逐元素四舍五入
x.exp() #逐元素计算自然常数为底的指数
x.log() #逐元素计算 x 的自然对数
x.reciprocal() #逐元素求倒数
x.square() #逐元素计算平方
x.sqrt() #逐元素计算平方根
x.sin() #逐元素计算正弦
x.cos() #逐元素计算余弦
但是要注意,和基本算术操作中提到的六种逐元素操作相比(需要至少两个tensor参与操作),这些操作只有一个tensor参与操作
指定维度上的操作
这类操作需要指定在某一维度的所有元素都参与操作,如果没有指定维度,则在全部维度上进行操作:
-
元素最大值:
x.max(axis=None, keepdim=False)
、paddle.max(x, axis=None, keepdim=False, name=None)
对输入有多个最大值的情况下,max 将梯度完整传回到最大值对应的位置,amax 会将梯度平均传回到最大值对应的位置
axis为求最大值运算的维度,可以为数值、列表、元组。如果为 None,则计算所有元素的最大值并返回包含单个元素的 Tensor 变量,否则axis的值必须在 [ − ( x . n d i m ) , x . n d i m ] [-(x.ndim), x.ndim] [−(x.ndim),x.ndim] 之间。如果 a x i s [ 0 ] < 0 axis[0]<0 axis[0]<0 ,则将维度变为 x . n d i m + a x i s [ 0 ] x.ndim+axis[0] x.ndim+axis[0] 。
keepdim表示是否在输出 Tensor 中保留输入的维度。除非 keepdim 为 True,否则输出 Tensor 的维度将比输入 Tensor 小一维。
x.max(axis=0) """ Tensor(shape=[3], dtype=int64, place=Place(gpu:0), stop_gradient=True, [9, 7, 9]) """ x.max(axis=1) """ Tensor(shape=[3], dtype=int64, place=Place(gpu:0), stop_gradient=True, [9, 9, 7]) """ x.max(axis=1, keepdim=True) """ Tensor(shape=[3, 1], dtype=int64, place=Place(gpu:0), stop_gradient=True, [[9], [9], [7]]) """
这里必须要搞明白axis如果传入一个list或tuple代表什么含义,在这里举个简单具象一些的例子:
假设我们传入的数据形式为 (batch, c, h, w),现在我们想要求每个batch里每个h×w的矩阵的最大值,那么每个batch就会求得c个最大值,用作最后的池化结果,那么我们要做的操作就是x.max(axis=[2, 3]),即把2、3这两个维度上的数单独拎出来求出一个最大值。
我个人更喜欢从“维度消除”的思路理解axis这个参数,比如一个3×4×5的矩阵,对axis=0操作,则会消除3这个维度,输出为4×5。所以,必须要明确求什么最大值,才能对axis有一个明确的理解。
-
元素最小值:
x.max(axis=None, keepdim=False)
、paddle.max(x, axis=None, keepdim=False, name=None)
用法和max保持一致
-
元素累加:
x.sum(axis=None, keepdim=False)
、paddle.sum(x, axis=None, dtype=None, keepdim=False, name=None)
用法不再多说,需要注意的一点是paddle.sum()多个dtype的参数,表示指定输出变量的数据类型,若参数为空,则输出变量的数据类型和输入变量相同。但是这个参数一般也不会用到。
-
元素累乘:
x.prod(axis=None, keepdim=False)
、paddle.prod(x, axis=None, keepdim=False, dtype=None, name=None)
逻辑运算
常用的逻辑比较运算有以下6种:
-
相等,以下两种函数都是判断相同位置的元素是否相等
- 全部元素相等:
x.equal_all(y)
、paddle.equal_all(x, y)
,只返回一个bool值,必须要相同位置的元素都相等才返回True - 每个元素相等:
x.equal(y)
、x == y
、paddle.equal(x, y)
,返回一个和x相同形状的bool值的Tensor,对于某个位置而言,相同为True,不相同为False
要明确使用场景
- 全部元素相等:
-
不相等:
x != y
、x.not_equal(y)
、paddle.not_equal(x, y)
,返回一个和x相同形状的bool值的Tensor,对于某个位置而言,不相同为True,相同为False -
小于:
x < y
、x.less_than(y)
、paddle.less_than(x, y)
,返回一个和x相同形状的bool值的Tensor -
小于等于:
x <= y
、x.less_equal(y)
、paddle.less_equal(x, y)
,返回一个和x相同形状的bool值的Tensor -
大于:
x > y
、x.greater_than(y)
、paddle.greater_than(x, y)
,返回一个和x相同形状的bool值的Tensor -
大于等于:
x >= y
、x.greater_equal(y)
、paddle.greater_equal(x, y)
,返回一个和x相同形状的bool值的Tensor
同时还有2个不常用的函数:
-
元素是否是有限的数字(即不包含inf和nan):
x.isfinite()
、paddle.isfinite(x)
,返回一个和x相同形状的bool值的Tensor,表示输入 Tensor 的每一个值是否为有限值(既非 +/-INF 也非 +/-NaN )注:
float('inf')
、float('nan')
可以指定这两种输入 -
元素是否接近:
x.allclose(y, rtol=1e-05, atol=1e-08, equal_nan=False)
、paddle.allclose(x, y, rtol=1e-05, atol=1e-08, equal_nan=False)
,只返回一个bool值rtol是相对容忍误差,atol是绝对容忍误差,如果对每个位置的元素都有 ∣ x − y ∣ ≤ a t o l + r t o l × ∣ y ∣ |x-y| \leq atol+rtol\times |y| ∣x−y∣≤atol+rtol×∣y∣ 则返回True
equal_nan如果设置为 True,则两个 NaN 数值将被视为相等,否则视为两个NaN不相等