【问题标题】:TensorFlow: Take L2 norm over multiple dimensionsTensorFlow:在多个维度上采用 L2 范数
【发布时间】:2017-10-27 23:17:25
【问题描述】:

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

【问题讨论】:

    标签: multidimensional-array tensorflow normalization tensor


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-06-21
          • 2017-09-03
          • 1970-01-01
          • 2013-03-31
          • 2023-03-17
          • 2020-07-24
          • 1970-01-01
          相关资源
          最近更新 更多