4

我有一个 TensorFlow 占位符,它有 4 个维度,代表一批图像。每个图像为 32 x 32 像素,每个像素有 3 个颜色通道。第一个维度表示图像的数量。

X = tf.placeholder(tf.float32, [None, 32, 32, 3])

对于每张图像,我想采用所有图像像素的 L2 范数。因此,输出应该是一个一维的张量(即每个图像一个值)。(文档)接受一个轴参数,但当我想在轴 1、2 和 3 上取范数时,它只允许我指定最多两个轴取范数。我该怎么做tf.norm()

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
4

3 回答 3

2

您不需要其他答案中建议的展平。如果您仔细阅读文档,您会看到:

axis:如果axis为None(默认值),则输入被认为是一个向量,并且在张量中的整个值集上计算单个向量范数,即 norm(tensor, ord=ord) 等价于 norm(reshape(张量, [-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)
于 2017-05-27T07:30:52.447 回答
1

您可以像这样自己计算 L2 范数:

tf.sqrt(tf.reduce_sum(tf.pow(images,2), axis=(1,2,3)))
于 2020-08-25T06:08:07.063 回答
1

我尝试了萨尔瓦多的答案,但看起来它为整个小批量返回一个数字,而不是每个图像一个数字。所以看起来我们可能会被困在每个维度上做规范。

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 支持这一点是有原因的,但事实并非如此。

于 2017-11-20T21:21:13.323 回答