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