Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multidimensional array TensorFlow:在多维上取L2范数_Multidimensional Array_Tensorflow_Normalization_Tensor - Fatal编程技术网

Multidimensional array TensorFlow:在多维上取L2范数

Multidimensional array TensorFlow:在多维上取L2范数,multidimensional-array,tensorflow,normalization,tensor,Multidimensional Array,Tensorflow,Normalization,Tensor,我有一个TensorFlow占位符,4维代表一批图像。每个图像是32 x 32像素,每个像素有3个颜色通道。第一个维度表示图像的数量 X=tf.placeholder(tf.float32[None,32,32,3]) 对于每个图像,我想取所有图像像素的L2范数。因此,输出应为一维张量(即,每幅图像一个值)。tf.norm()()接受一个轴参数,但它只允许我指定两个轴,当我想在轴1、2和3上取范数时,取范数。我该怎么做 n = tf.norm(X, ord=2, axis=0)

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

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

对于每个图像,我想取所有图像像素的L2范数。因此,输出应为一维张量(即,每幅图像一个值)。
tf.norm()
()接受一个轴参数,但它只允许我指定两个轴,当我想在轴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

你不需要在另一个答案中建议的扁平化。如果你仔细阅读,你会发现:

轴:如果轴为无(默认值),则输入被视为向量 一个单一的向量范数是在一组完整的值上计算出来的 张量,即范数(张量,ord=ord)等于 范数(重塑(张量,[-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)

我尝试了Salvador的答案,但它似乎为整个迷你批次返回一个数字,而不是每个图像返回一个数字。所以看起来我们可能会被困在每个维度的标准中

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

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

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