norm

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

该OP将计算给定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)的种类。目前支持的值为 fro、inf、-inf、0、1、2,和任何正实数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|None) - 该参数供开发人员打印调试信息时使用,具体用法请参见 Name 。默认值为None。

返回

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

代码示例

  1. import paddle
  2. import numpy as np
  3. shape=[2, 3, 4]
  4. np_input = np.arange(24).astype('float32') - 12
  5. np_input = np_input.reshape(shape)
  6. x = paddle.to_tensor(np_input)
  7. #[[[-12. -11. -10. -9.] [ -8. -7. -6. -5.] [ -4. -3. -2. -1.]]
  8. # [[ 0. 1. 2. 3.] [ 4. 5. 6. 7.] [ 8. 9. 10. 11.]]]
  9. # compute frobenius norm along last two dimensions.
  10. out_fro = paddle.norm(x, p='fro', axis=[0,1])
  11. # out_fro.numpy() [17.435596 16.911535 16.7332 16.911535]
  12. # compute 2-order vector norm along last dimension.
  13. out_pnorm = paddle.norm(x, p=2, axis=-1)
  14. #out_pnorm.numpy(): [[21.118711 13.190906 5.477226]
  15. # [ 3.7416575 11.224972 19.131126]]
  16. # compute 2-order norm along [0,1] dimension.
  17. out_pnorm = paddle.norm(x, p=2, axis=[0,1])
  18. #out_pnorm.numpy(): [17.435596 16.911535 16.7332 16.911535]
  19. # compute inf-order norm
  20. out_pnorm = paddle.norm(x, p=np.inf)
  21. #out_pnorm.numpy() = [12.]
  22. out_pnorm = paddle.norm(x, p=np.inf, axis=0)
  23. #out_pnorm.numpy(): [[12. 11. 10. 9.] [8. 7. 6. 7.] [8. 9. 10. 11.]]
  24. # compute -inf-order norm
  25. out_pnorm = paddle.norm(x, p=-np.inf)
  26. #out_pnorm.numpy(): [0.]
  27. out_pnorm = paddle.norm(x, p=-np.inf, axis=0)
  28. #out_pnorm.numpy(): [[0. 1. 2. 3.] [4. 5. 6. 5.] [4. 3. 2. 1.]]