如何解决了解 3D 张量的 L2 范数输出 - TensorFlow2
对于 Python 3.8 和 TensorFlow 2.5,我有一个形状为 (3,3,3) 的 3-D 张量,其目标是计算三个 (3,3) 方阵中每一个的 L2 范数。我想出的代码是:
a = tf.random.normal(shape = (3,3))
a.shape
# TensorShape([3,3])
a.numpy()
'''
array([[[-0.30071023,0.9958398,-0.77897555],[-1.4251901,0.8463568,-0.6138699 ],[ 0.23176959,-2.1303613,0.01905925]],[[-1.0487134,-0.36724553,-1.0881581 ],[-0.12025198,0.20973174,-2.1444907 ],[ 1.4264063,-1.5857363,0.31582597]],[[ 0.8316077,-0.7645084,1.5271858 ],[-0.95836663,-1.868056,-0.04956183],[-0.16384012,-0.18928945,1.04647 ]]],dtype=float32)
'''
我使用轴 = 2,因为第三个轴应该包含三个 3x3 方阵。我得到的输出是:
tf.math.reduce_euclidean_norm(input_tensor = a,axis = 2).numpy()
'''
array([[1.299587,1.7675754,2.1430166],[1.5552354,2.158075,2.15614 ],[1.8995634,2.1001325,1.0759989]],dtype=float32)
'''
这些值是如何计算的? L2范数的计算公式为this。我错过了什么?
此外,我期待三个 L2 范数值,三个 (3,3) 矩阵中的每一个都有一个。我必须实现这一点的代码是:
tf.math.reduce_euclidean_norm(a[0]).numpy()
# 3.0668826
tf.math.reduce_euclidean_norm(a[1]).numpy()
# 3.4241767
tf.math.reduce_euclidean_norm(a[2]).numpy()
# 3.0293021
有没有更好的方法来获得这个而不必明确引用张量“a”的每个索引?
谢谢!
解决方法
您链接的用于计算 L2 范数的公式看起来是正确的。你所拥有的基本上是这样的:
np.sqrt(np.sum((a[0]**2)))
# 3.0668826
np.sqrt(np.sum((a[1]**2)))
# 3.4241767
np.sqrt(np.sum((a[2]**2)))
# 3.0293021
这可以通过以下方式进行矢量化:
np.sqrt(np.sum(a**2,axis=(1,2)))
输出:
array([3.0668826,3.4241767,3.0293021],dtype=float32)
这与使用 np.lingalg.norm
(或 tf.math.reduce_euclidean_norm
,如果您想使用 tensorflow)实际上相同
np.linalg.norm(a,ord=None,2))
输出:
array([3.0668826,dtype=float32)
默认关键字 ord=None
用于根据 documentation 计算 L2 范数。 axis
关键字用于指定我们要减少哪些维度,哪些维度应该从第一个代码片段中明确。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。