python - ¿Cuál es la diferencia entre np.mean y tf.reduce_mean?
numpy machine-learning (4)
La clave aquí es la palabra reducir, un concepto de programación funcional, que hace posible que reduce_mean en TensorFlow mantenga un promedio de los resultados de los cálculos de un lote de entradas.
Si no está familiarizado con la programación funcional, esto puede parecer misterioso. Entonces, primero veamos qué reduce. Si le dieron una lista como [1,2,5,4] y le dijeron que calcule la media, eso es fácil: simplemente pase toda la matriz a np.mean y obtendrá la media. Sin embargo, ¿qué pasaría si tuviera que calcular la media de una secuencia de números? En ese caso, primero tendría que ensamblar la matriz leyendo de la secuencia y luego llamar a np.mean en la matriz resultante; tendría que escribir más código.
Una alternativa es utilizar el paradigma de reducción.
Como ejemplo, observe cómo podemos usar reducir en python para calcular la suma de números:
reduce(lambda x,y: x+y, [1,2,5,4])
.
Funciona así:
- Paso 1: Leer 2 dígitos de la lista - 1,2. Evaluar lambda 1,2. reducir almacena el resultado 3. Nota: este es el único paso donde se leen 2 dígitos de la lista
- Paso 2: Lea el siguiente dígito de la lista: 5. Evalúe lambda 5, 3 (3 es el resultado del paso 1, que reduce el almacenamiento). reducir almacena el resultado 8.
- Paso 3: Lea el siguiente dígito de la lista: 4. Evalúe lambda 8,4 (8 es el resultado del paso 2, que reduce el almacenamiento). reducir almacena el resultado 12
- Paso 4: Lea el siguiente dígito de la lista; no hay ninguno, así que devuelva el resultado almacenado de 12.
Lea más aquí Programación funcional en Python
Para ver cómo se aplica esto a TensorFlow, observe el siguiente bloque de código, que define un gráfico simple, que toma un flotante y calcula la media. Sin embargo, la entrada al gráfico no es un flotador simple sino una matriz de flotadores. Reduce_mean calcula el valor medio de todos esos flotadores.
import tensorflow as tf
inp = tf.placeholder(tf.float32)
mean = tf.reduce_mean(inp)
x = [1,2,3,4,5]
with tf.Session() as sess:
print(mean.eval(feed_dict={inp : x}))
Este patrón es útil cuando se calculan valores sobre lotes de imágenes. Mire el ejemplo de Deep MNIST donde ve código como:
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
En el tutorial para principiantes MNIST , está la declaración
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
tf.cast
básicamente cambia el tipo de tensor que es el objeto, pero ¿cuál es la diferencia entre
tf.reduce_mean
y
np.mean
?
Aquí está el documento sobre
tf.reduce_mean
:
reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
input_tensor
: el tensor a reducir. Debe tener tipo numérico.
reduction_indices
: las dimensiones a reducir. SiNone
(el valor predeterminado), reduce todas las dimensiones.
# ''x'' is [[1., 1. ]] # [2., 2.]] tf.reduce_mean(x) ==> 1.5 tf.reduce_mean(x, 0) ==> [1.5, 1.5] tf.reduce_mean(x, 1) ==> [1., 2.]
Para un vector 1D, parece
np.mean == tf.reduce_mean
, pero no entiendo lo que está sucediendo en
tf.reduce_mean(x, 1) ==> [1., 2.]
.
tf.reduce_mean(x, 0) ==> [1.5, 1.5]
tiene sentido, ya que la media de [1,2] y [1,2] es [1.5,1.5] pero lo que está sucediendo con
tf.reduce_mean(x,1)
?
La funcionalidad de
numpy.mean
y
tensorflow.reduce_mean
son las mismas.
Ellos hacen la misma cosa.
De la documentación, para
numpy
y
tf.reduce_mean
, puedes ver eso.
Veamos un ejemplo,
c = np.array([[3.,4], [5.,6], [6.,7]])
print(np.mean(c,1))
Mean = tf.reduce_mean(c,1)
with tf.Session() as sess:
result = sess.run(Mean)
print(result)
Salida
[ 3.5 5.5 6.5]
[ 3.5 5.5 6.5]
Aquí puede ver que cuando
axis
(numpy) o reduce_indices (tensorflow) es 1, calcula la media en (3,4) y (5,6) y (6,7), por lo que
1
define en qué eje se calcula la media .
Cuando es 0, la media se calcula a través de (3,5,6) y (4,6,7), y así sucesivamente.
Espero que captes la idea.
¿Cuáles son las diferencias entre ellos?
Puede calcular la operación numpy en cualquier lugar de Python.
Pero para hacer una operación de tensorflow, debe hacerse dentro de una
Session
tensorflow.
Puedes leer más sobre esto
here
.
Entonces, cuando necesite realizar algún cálculo para su gráfico de tensorflow (o estructura, si lo desea), debe hacerlo dentro de una
Session
tensorflow.
Veamos otro ejemplo.
npMean = np.mean(c)
print(npMean+1)
tfMean = tf.reduce_mean(c)
Add = tfMean + 1
with tf.Session() as sess:
result = sess.run(Add)
print(result)
Podríamos aumentar la media en
1
en
numpy
como lo haría naturalmente, pero para hacerlo en tensorflow, debe realizar eso en la
Session
, sin usar la
Session
no puede hacerlo.
En otras palabras, cuando estás calculando
tfMean = tf.reduce_mean(c)
, el tensorflow no lo calcula entonces.
Solo lo calcula en una
Session
.
Pero numpy calcula eso instantáneamente, cuando escribes
np.mean()
.
Espero que tenga sentido.
La nueva documentación establece que tf.reduce_mean produce los mismos resultados que np.mean:
Equivalente a np.mean
También tiene absolutamente los mismos parámetros que np.mean . Pero aquí hay una diferencia importante: producen los mismos resultados solo en valores flotantes :
import tensorflow as tf
import numpy as np
from random import randint
num_dims = 10
rand_dim = randint(0, num_dims - 1)
c = np.random.randint(50, size=tuple([5] * num_dims)).astype(float)
with tf.Session() as sess:
r1 = sess.run(tf.reduce_mean(c, rand_dim))
r2 = np.mean(c, rand_dim)
is_equal = np.array_equal(r1, r2)
print is_equal
if not is_equal:
print r1
print r2
Si eliminará la conversión de tipos, verá resultados diferentes
Además de esto, muchas otras funciones
tf.reduce_
como
reduce_all
,
reduce_any
,
reduce_min
,
reduce_max
,
reduce_prod
producen los mismos valores que hay análogos innumerables.
Claramente porque son operaciones, solo pueden ejecutarse desde el interior de la sesión.
1
usualmente se refiere a filas y
2
usualmente se refiere a columnas.
Reducir el índice "sobre"
1
significa reducir el rowwise.
[1., 2.]
es solo
[ <row 1 mean> , <row 2 mean> ]
.
Esta convención de numeración de índices es típica en el software de estadísticas, especialmente R.