TensorFlow:在多维度上采用L2范数

时间:2017-05-27 01:40:45

标签: multidimensional-array tensorflow normalization tensor

我有一个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

3 个答案:

答案 0 :(得分:2)

您不需要在另一个答案中建议的扁平化。如果您仔细阅读live on ideone,您会看到:

  

轴:如果axis为None(默认值),则输入被视为矢量   并且在整个值集合中计算单个向量范数   张量,即范数(张量,ord = ord)等价于   规范(重塑(张量,[ - 1]),ord = ord)

示例:

$target_dir = "articles/article-images/";
$target_new_name = "imag_xpto.jpg";
//your code...
$target = $target_dir.$target_new_name;
if (move_uploaded_file($_FILES["fileToUpload"]["tmp_name"], $target_file)){
//Your code...

答案 1 :(得分:1)

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

{{1}}

这可能会引入少量的数值不稳定性,但理论上它与同时采用整个图像的范数相同。

您可能还会考虑仅在x和y轴上采用标准,以便每个通道获得一个标准。有一个原因可以解释为什么这种情况得到了张量流的支持,而事实并非如此。

答案 2 :(得分:0)

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

tf.sqrt(tf.reduce_sum(tf.pow(images,2), axis=(1,2,3)))