每个元素平方求和后,开根号。
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]
如需更详细的参数说明或高级用法,可参考官方文档或相关教程。