每个元素平方求和后,开根号。

a = [[2.,3.,3.], [2.,3.,3.]]
tf.norm(a)
 <tf.Tensor: shape=(), dtype=float32, numpy=6.6332498>

在 TensorFlow 中,tf.norm 是用于计算张量范数的函数,支持多种范数类型(如 L1、L2、无穷范数等)和维度操作。以下是其核心功能和使用方法的总结:


1. 基本功能与参数

作用:计算向量、矩阵或高维张量的范数。 • 参数

tensor:输入张量,需为浮点类型。 • ord:范数类型,默认为 'euclidean'(L2 范数)。支持的选项包括:

◦ `1`(L1 范数)、`2`(L2 范数)、`np.inf`(无穷范数)、`'fro'`(Frobenius 范数,仅矩阵)等。

axis:指定计算的维度。若为 None,则计算全局范数;若为整数或元组,则沿指定维度计算。 • keepdims:是否保留计算后的维度(默认为 False)。


2. 常见范数类型

L2 范数(默认)
计算所有元素的平方和再开根号。例如:

a = tf.constant([[1.0, 2.0], [3.0, 4.0]])
tf.norm(a)  # 输出:5.477226(等价于欧几里得范数)

L1 范数
计算所有元素的绝对值之和。例如:

b = tf.constant([1.0, -2.0, 3.0])
tf.norm(b, ord=1)  # 输出:6.0(|1| + |-2| + |3|)

无穷范数
取所有元素绝对值的最大值。例如:

c = tf.constant([[-1.0, 4.0], [3.0, -2.0]])
tf.norm(c, ord=np.inf)  # 输出:4.0(max(|-1|, |4|, |3|, |-2|))

Frobenius 范数
针对矩阵,等价于 L2 范数的展开形式。例如:

tf.norm(a, ord='fro')  # 输出与 L2 范数相同

3. 沿指定维度计算

通过 axis 参数可控制计算方向:

全局计算(默认):

tf.norm(a)  # 计算整个张量的 L2 范数
按行/列计算
# 沿列计算 L2 范数(axis=0)
tf.norm(a, axis=0)  # 输出:[3.1622777, 4.472136]

# 按行计算 L1 范数(axis=1)
d = tf.constant([[1.0, -2.0], [3.0, -4.0]])
tf.norm(d, ord=1, axis=1)  # 输出:[3.0, 7.0]


4. 应用场景

梯度裁剪
使用 tf.clip_by_norm 结合 tf.norm 限制梯度大小,防止梯度爆炸。

grads = [tf.clip_by_norm(g, clip_norm=1.0) for g in gradients]

模型评估
计算预测值与标签的差异,如准确率计算中的误差统计。


5. 与 NumPy 的差异

默认行为
tf.norm 对高维张量默认计算全局范数,而 np.linalg.norm 对矩阵默认计算 Frobenius 范数。 • 维度处理
TensorFlow 的 axis 参数支持更灵活的维度控制,而 NumPy 的 axis 行为略有不同。


代码示例

import tensorflow as tf
import numpy as np

# 示例 1:矩阵的 Frobenius 范数
matrix = tf.constant([[2.0, 4.0], [6.0, 8.0]])
print(tf.norm(matrix, ord='fro'))  # 输出:10.954451

# 示例 2:沿特定轴计算 L1 范数
data = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
print(tf.norm(data, ord=1, axis=0))  # 输出:[5.0, 7.0, 9.0]

如需更详细的参数说明或高级用法,可参考官方文档或相关教程。