Multidimensional array TensorFlow:在多维上取L2范数
我有一个TensorFlow占位符,4维代表一批图像。每个图像是32 x 32像素,每个像素有3个颜色通道。第一个维度表示图像的数量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)
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)))