norm

paddle.linalg.norm(x, p='fro', axis=None, keepdim=False, name=None):

将计算给定 Tensor 的矩阵范数(Frobenius 范数)和向量范数(向量 1 范数、2 范数、或者通常的 p 范数)。

注解

此 API 与 numpy.linalg.norm 存在差异。此 API 支持高阶张量(rank>=3)作为输入,输入 axis 对应的轴就可以计算出 norm 的值。但是 numpy.linalg.norm 仅支持一维向量和二维矩阵作为输入。特别需要注意的是,此 API 的 P 阶矩阵范数,实际上将矩阵摊平成向量计算。实际计算的是向量范数,而不是真正的矩阵范数。

参数

  • x (Tensor) - 输入 Tensor。维度为多维,数据类型为 float32 或 float64。

  • p (float|string,可选) - 范数(ord)的种类。目前支持的值为 froinf-inf012,和任何正实数 p 对应的 p 范数。默认值为 fro

  • axis (int|list|tuple,可选) - 使用范数计算的轴。如果 axis 为 None,则忽略 input 的维度,将其当做向量来计算。如果 axis 为 int 或者只有一个元素的 list|tuple,norm API 会计算输入 Tensor 的向量范数。如果 axis 为包含两个元素的 list,API 会计算输入 Tensor 的矩阵范数。当 axis < 0 时,实际的计算维度为 rank(input) + axis。默认值为 None

  • keepdim (bool,可选) - 是否在输出的 Tensor 中保留和输入一样的维度,默认值为 False。当 keepdim 为 False 时,输出的 Tensor 会比输入 input 的维度少一些。

  • name (str,可选) - 具体用法请参见 Name,一般无需设置,默认值为 None。

返回

Tensor,在指定 axis 上进行范数计算的结果,与输入 input 数据类型相同。

代码示例

import paddle
x = paddle.arange(24, dtype="float32").reshape([2, 3, 4]) - 12
# x: Tensor(shape=[2, 3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
#          [[[-12., -11., -10., -9. ],
#            [-8. , -7. , -6. , -5. ],
#            [-4. , -3. , -2. , -1. ]],

#           [[ 0. ,  1. ,  2. ,  3. ],
#            [ 4. ,  5. ,  6. ,  7. ],
#            [ 8. ,  9. ,  10.,  11.]]])

# compute frobenius norm along last two dimensions.
out_fro = paddle.linalg.norm(x, p='fro', axis=[0,1])
# out_fro: Tensor(shape=[4], dtype=float32, place=Place(cpu), stop_gradient=True,
#                 [17.43559647, 16.91153526, 16.73320007, 16.91153526])

# compute 2-order vector norm along last dimension.
out_pnorm = paddle.linalg.norm(x, p=2, axis=-1)
# out_pnorm: Tensor(shape=[2, 3], dtype=float32, place=Place(cpu), stop_gradient=True,
#                [[21.11871147, 13.19090557, 5.47722578 ],
#                 [3.74165750 , 11.22497177, 19.13112640]])

# compute 2-order  norm along [0,1] dimension.
out_pnorm = paddle.linalg.norm(x, p=2, axis=[0,1])
# out_pnorm: Tensor(shape=[4], dtype=float32, place=Place(cpu), stop_gradient=True,
#                  [17.43559647, 16.91153526, 16.73320007, 16.91153526])

# compute inf-order  norm
out_pnorm = paddle.linalg.norm(x, p=float("inf"))
# out_pnorm  = Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
#                    [12.])

out_pnorm = paddle.linalg.norm(x, p=float("inf"), axis=0)
# out_pnorm: Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
#                 [[12., 11., 10., 9. ],
#                  [8. , 7. , 6. , 7. ],
#                  [8. , 9. , 10., 11.]])

# compute -inf-order  norm
out_pnorm = paddle.linalg.norm(x, p=-float("inf"))
# out_pnorm: Tensor(shape=[1], dtype=float32, place=Place(cpu), stop_gradient=True,
#                  [0.])

out_pnorm = paddle.linalg.norm(x, p=-float("inf"), axis=0)
# out_pnorm: Tensor(shape=[3, 4], dtype=float32, place=Place(cpu), stop_gradient=True,
#                  [[0., 1., 2., 3.],
#                  [4., 5., 6., 5.],
#                  [4., 3., 2., 1.]])