norm¶
- paddle.linalg.norm(x, p=None, axis=None, keepdim=False, name=None):
将计算给定 Tensor 的矩阵范数(Frobenius 范数, Nuclear 范数或 p 范数)和向量范数(向量 1 范数、2 范数、或者通常的 p 范数)。
该函数计算的是向量范数还是矩阵范数,确定方法如下: - 如果 axis 是 int 类型,计算向量范数 - 如果 axis 是二维数组,计算矩阵范数 - 如果 axis 为 None,x 会被压缩成一维向量然后计算向量范数
Paddle 支持以下范数:
参数¶
x (Tensor) - 输入 Tensor。维度为多维,数据类型为 float32 或 float64。
p (int|float|string,可选) - 范数(ord)的种类。目前支持的值为 fro、nuc、inf、-inf、0、1、2,和任何实数 p 对应的 p 范数。默认值为 None。
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
>>> print(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])
>>> print(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)
>>> print(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])
>>> print(out_pnorm)
Tensor(shape=[4], dtype=float32, place=Place(cpu), stop_gradient=True,
[15.75857544, 14.97978878, 14.69693947, 14.97978973])
>>> # compute inf-order norm
>>> out_pnorm = paddle.linalg.norm(x, p=float("inf"))
>>> print(out_pnorm)
Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
12.)
>>> out_pnorm = paddle.linalg.norm(x, p=float("inf"), axis=0)
>>> print(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"))
>>> print(out_pnorm)
Tensor(shape=[], dtype=float32, place=Place(cpu), stop_gradient=True,
0.)
>>> out_pnorm = paddle.linalg.norm(x, p=-float("inf"), axis=0)
>>> print(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.]])