版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/NockinOnHeavensDoor/article/details/83246413
tf.norm
tf.norm(
tensor,
ord='euclidean',
axis=None,
keepdims=None,
name=None,
keep_dims=None
)
作用:计算向量,矩阵的范数。
参数:
- tensor: 要计算的张量。
- ord:指定做什么样的范数计算。支持
'fro', 'euclidean', 1, 2, np.inf
还有任意正值来计算p范数
。默认是euclidean
范数,即对向量而言是2-范数
,对矩阵而言就是计算Frobenius
范数。有如下限制:1.Frobenius
范数的声明fro
对向量是未定义的;2.tensor
的axis
大小是2,只支持'euclidean', 'fro', 1, 2, np.inf
。 - axis: 如果
axis
是None (the default)
,输入被视为一个向量,整个tensor
计算出一个范数值。如果axis
是一个整数,输入被视为batch
的一堆向量;如果axis
是二元组(2-turple)
整数,则输入视为batch
的一堆矩阵。支持负的索引,比如输入的tensor
在运行时,可以视为一个矩阵或者一个batch
的一堆矩阵,传递axis=[-2,-1]
确保计算的是矩阵范数。 - keepdims:
- name:
例子:
看出来设置axis=1
的时候计算每一行向量的2范数;
当我传入的tensor
是包含三个矩阵的batch
的时候,传递axis=[-2,-1]
计算各矩阵的F范数;
当我传入的是作为一个单独矩阵的tensor
的时候,计算的是这一个矩阵的F范数
。
i = tf.cast(np.random.random_integers(0,5,(4,3)),tf.float32)
matrix = tf.constant([[[2], [4], [6]], [[8], [10], [12]], [[14], [16], [18]]],tf.float32)
norm = tf.norm(i,axis=1)
matrix_norm = tf.norm(matrix,ord='fro',axis=[-2,-1])
matrix_first_element_norm = tf.norm(matrix[0],ord='fro',axis=[-2,-1])
#等价于计算矩阵F范数
same_matrix_ele_norm = tf.sqrt(tf.reduce_sum(tf.square(matrix[0])))
with tf.Session() as sess:
print(sess.run(i))
print(sess.run(norm))
print("matrix_norm:",sess.run(matrix_norm))
print("matrix_first_element_norm:",sess.run(matrix_first_element_norm))
print("same_matrix_ele_norm:",sess.run(same_matrix_norm))
输出:
[[4. 0. 1.]
[1. 1. 5.]
[4. 4. 2.]
[4. 4. 0.]]
[4.1231055 5.196152 5.9999995 5.6568537]
matrix_norm: [ 7.483315 17.549929 27.856777]
matrix_first_element_norm: 7.483315
same_matrix_ele_norm: 7.483315