2017-05-27 3 views
1

J'ai un espace réservé TensorFlow avec 4 dimensions représentant un lot d'images. Chaque image est de 32 x 32 pixels et chaque pixel possède 3 canaux de couleur. Les premières dimensions représentent le nombre d'images.TensorFlow: Prendre la norme L2 sur plusieurs dimensions

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

Pour chaque image, je voudrais prendre la norme L2 de tous les pixels de l'image. Ainsi, la sortie doit être un tenseur avec une dimension (c'est-à-dire une valeur par image). Le tf.norm() (documentation) accepte un paramètre d'axe, mais il me permet seulement de spécifier jusqu'à deux axes sur lesquels prendre la norme, quand je voudrais prendre la norme sur les axes 1, 2 et 3. Comment faire?

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 

Répondre

1

Vous n'avez pas besoin d'aplatissement, ce qui a été suggéré dans l'autre réponse. Si vous lisez attentivement documentation, vous verriez:

axe: Si l'axe est Aucun (par défaut), l'entrée est considérée comme un vecteur et une norme unique vecteur est calculé sur l'ensemble des valeurs dans le tenseur, à savoir la norme (tenseur, ord = ord) est équivalente à norme (remodeler (tenseur, [-1]), ord = ord)

Exemple:

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) 
0

I essayé Salvador de répondre mais il semble que cela renvoie un nombre pour l'ensemble de la minibatch au lieu d'un nombre par image. Il semble donc que nous soyons coincés à faire la norme par dimension.

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) 

Cela pourrait introduire une petite quantité d'instabilité numérique, mais en théorie, il est le même que celui de prendre la norme de l'ensemble de l'image à la fois.

Vous pourriez aussi penser à ne prendre la norme sur les axes x et y afin que vous obtenez une norme par canal. Il y a une raison pour laquelle cela est supporté par tensorflow et ce n'est pas le cas.