Tengo un tensor de forma [x, y] y quiero restar la media y dividir por la desviación estándar en filas (es decir, quiero hacerlo para cada fila). ¿Cuál es la forma más eficiente de hacer esto en TensorFlow?

Por supuesto, puedo recorrer las filas de la siguiente manera:

new_tensor = [i - tf.reduce_mean(i) for i in old_tensor]

... para restar la media y luego hacer algo similar para encontrar la desviación estándar y dividir por ella, pero ¿es esta la mejor manera de hacerlo en TensorFlow?

4
puma314 1 ago. 2016 a las 22:00

2 respuestas

La mejor respuesta

Los operadores de TensorFlow tf.sub() y tf.div() admiten la transmisión, por lo que no es necesario que recorras todas las filas. Consideremos la media y dejemos la desviación estándar como ejercicio:

old_tensor = ...                                          # shape = (x, y)
mean = tf.reduce_mean(old_tensor, 1, keep_dims=True)      # shape = (x, 1)                    

stdev = ...                                               # shape = (x,)
stdev = tf.expand_dims(stdev, 1)                          # shape = (x, 1)

new_tensor = old_tensor - mean                            # shape = (x, y)
new_tensor = old_tensor / stdev                           # shape = (x, y)

Los operadores de resta y división transmiten implícitamente un tensor de forma (x, 1) a lo largo de la dimensión de la columna para que coincida con la forma del otro argumento, (x, y). Para obtener más detalles sobre cómo funciona la transmisión, consulte la documentación de NumPy sobre el tema (TensorFlow implementa la semántica de transmisión de NumPy).

6
Oren 29 nov. 2016 a las 18:56
  1. calcular momentos a lo largo del eje 1 (y en su caso) y mantener las dimensiones, es decir, la forma de la media y var es (len (x), 1)
  2. restar la media y dividir por la desviación estándar (es decir, raíz cuadrada de la varianza)
mean, var = tf.nn.moments(old_tensor, [1], keep_dims=True)
new_tensor = tf.div(tf.subtract(old_tensor, mean), tf.sqrt(var))
8
gizzmole 1 feb. 2017 a las 23:57