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

Posted

技术标签:

【中文标题】TensorFlow:在多个维度上采用 L2 范数【英文标题】:TensorFlow: Take L2 norm over multiple dimensions 【发布时间】: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

【问题讨论】:

【参考方案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)))

【讨论】:

以上是关于TensorFlow:在多个维度上采用 L2 范数的主要内容,如果未能解决你的问题,请参考以下文章

tensorflow数据统计

L1范数与L2范数正则化

tensorflow l2_loss函数

L0,L1,L2范数及其应用

L0、L1及L2范数

NLP教程:啥是范数(norm)?以及L1,L2范数的简单介绍