TensorFlow:在多个维度上采用 L2 范数
Posted
技术标签:
【中文标题】TensorFlow:在多个维度上采用 L2 范数【英文标题】:TensorFlow: Take L2 norm over multiple dimensions 【发布时间】:2017-10-27 23:17:25 【问题描述】:我有一个 TensorFlow 占位符,它有 4 个维度,代表一批图像。每个图像为 32 x 32 像素,每个像素有 3 个颜色通道。第一个维度表示图像的数量。
X = tf.placeholder(tf.float32, [None, 32, 32, 3])
对于每张图像,我想采用所有图像像素的 L2 范数。因此,输出应该是一个一维的张量(即每个图像一个值)。 tf.norm()
(documentation) 接受一个轴参数,但是当我想在轴 1、2 和 3 上取范数时,它只允许我指定最多两个取范数的轴。如何做我这样做?
n = tf.norm(X, ord=2, axis=0) # n.get_shape() is (?, ?, 3), not (?)
n = tf.norm(X, ord=2, axis=[1,2,3]) # ValueError
【问题讨论】:
【参考方案1】:您不需要其他答案中建议的展平。如果你仔细阅读documentation,你会看到:
axis:如果axis是None(默认),输入被认为是一个向量 并且在整个值集上计算单个向量范数 张量,即 norm(tensor, ord=ord) 等价于 norm(reshape(tensor, [-1]), ord=ord)
例子:
import tensorflow as tf
import numpy as np
c = tf.constant(np.random.rand(3, 2, 3, 6))
d = tf.norm(c, ord=2)
with tf.Session() as sess:
print sess.run(d)
【讨论】:
【参考方案2】:我尝试了萨尔瓦多的答案,但看起来它为整个小批量返回一个数字,而不是每个图像一个数字。所以看起来我们可能会被困在每个维度上做规范。
import tensorflow as tf
import numpy as np
batch = tf.constant(np.random.rand(3, 2, 3, 6))
x = tf.norm(batch, axis=3)
x = tf.norm(x, axis=2)
x = tf.norm(x, axis=1)
with tf.Session() as sess:
result = sess.run(x)
print(result)
这可能会引入少量的数值不稳定性,但理论上它与一次性获取整个图像的范数相同。
您也可以考虑仅在 x 和 y 轴上取范数,以便每个通道获得一个范数。 tensorflow 支持这一点是有原因的,但事实并非如此。
【讨论】:
【参考方案3】:您可以像这样自己计算 L2 范数:
tf.sqrt(tf.reduce_sum(tf.pow(images,2), axis=(1,2,3)))
【讨论】:
以上是关于TensorFlow:在多个维度上采用 L2 范数的主要内容,如果未能解决你的问题,请参考以下文章