【PaddlePaddle】数学运算和逻辑运算

很久没有更新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 == ypaddle.equal(x, y),返回一个和x相同形状的bool值的Tensor,对于某个位置而言,相同为True,不相同为False

    要明确使用场景

  • 不相等:x != yx.not_equal(y)paddle.not_equal(x, y),返回一个和x相同形状的bool值的Tensor,对于某个位置而言,不相同为True,相同为False

  • 小于:x < yx.less_than(y)paddle.less_than(x, y),返回一个和x相同形状的bool值的Tensor

  • 小于等于:x <= yx.less_equal(y)paddle.less_equal(x, y),返回一个和x相同形状的bool值的Tensor

  • 大于:x > yx.greater_than(y)paddle.greater_than(x, y),返回一个和x相同形状的bool值的Tensor

  • 大于等于:x >= yx.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| xyatol+rtol×y 则返回True

    equal_nan如果设置为 True,则两个 NaN 数值将被视为相等,否则视为两个NaN不相等

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值