En el tutorial para principiantes de MNIST , está la declaración
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
tf.cast
básicamente cambia el tipo de tensor del objeto, pero ¿cuál es la diferencia entre tf.reduce_mean
y np.mean
?
Aquí está el documento tf.reduce_mean
:
reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
input_tensor
: El tensor a reducir. Debería tener tipo numérico.
reduction_indices
: Las dimensiones a reducir. SiNone
(el 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 qué está sucediendo en tf.reduce_mean(x, 1) ==> [1., 2.]
. tf.reduce_mean(x, 0) ==> [1.5, 1.5]
tiene sentido, ya que significa [1, 2]
y [1, 2]
es [1.5, 1.5]
, pero ¿qué está pasando tf.reduce_mean(x, 1)
?
tf.reduce_mean
es multiproceso, generalmente se calcula en su GPU, mientras quenp.mean
se calcula en una sola CPU. Además,tf
está diseñado para procesar un lote de datos, mientras quenp
actúa sobre una sola instancia de datos.Respuestas:
La funcionalidad de
numpy.mean
ytensorflow.reduce_mean
es la misma. Ellos hacen la misma cosa. En la documentación, para numpy y tensorflow , puede ver eso. Veamos un ejemplo,Salida
Aquí puede ver que cuando
axis
(numpy) oreduction_indices
(tensorflow) es 1, calcula la media en (3,4) y (5,6) y (6,7), por lo que1
define en qué eje se calcula la media. Cuando es 0, la media se calcula entre (3,5,6) y (4,6,7), y así sucesivamente. Espero que captes la idea.Ahora bien, ¿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 un tensorflow
Session
. Puedes leer más sobre esto aquí . Entonces, cuando necesite realizar cualquier cálculo para su gráfico de flujo tensorial (o estructura si lo desea), debe hacerlo dentro de un flujo tensorialSession
.Veamos otro ejemplo.
Podríamos aumentar la media
1
ennumpy
como lo haría naturalmente, pero para hacerlo en tensorflow, debe realizar esoSession
, sin usar,Session
no puede hacer eso. En otras palabras, cuando estás computandotfMean = tf.reduce_mean(c)
, tensorflow no lo computa entonces. Solo calcula eso en aSession
. Pero numpy calcula eso instantáneamente, cuando escribesnp.mean()
.Espero que tenga sentido.
fuente
La clave aquí es la palabra reduce, un concepto de la programación funcional, que hace posible que reduce_mean en TensorFlow mantenga un promedio móvil 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. Así que primero veamos qué hace reduce. Si le dieron una lista como [1, 2, 5, 4] y le dijeron que calcule la media, es fácil - simplemente pase la matriz completa a np.mean y obtendrá la media. Sin embargo, ¿qué pasaría si tuvieras que calcular la media de un flujo 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. A modo de ejemplo, ver cómo podemos utilizar reducir en Python para calcular la suma de los números:
reduce(lambda x,y: x+y, [1,2,5,4])
.Funciona así:
Leer 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 solo flotante, sino una matriz de flotantes. Reduce_mean calcula el valor medio de todos esos flotantes.
Este patrón es útil cuando se calculan valores sobre lotes de imágenes. Mire The Deep MNIST Example donde verá un código como:
fuente
La nueva documentación indica que
tf.reduce_mean()
produce los mismos resultados que 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 :
Si elimina la conversión de tipo, verá resultados diferentes
En adicional a esto, muchas otras
tf.reduce_
funciones tales comoreduce_all
,reduce_any
,reduce_min
,reduce_max
,reduce_prod
producen los mismos valores que allí análogos numpy. Claramente, debido a que son operaciones, solo se pueden ejecutar desde dentro de la sesión.fuente
tf.reduce_mean
garantiza que la salidadtype
coincida con la entradadtype
. La salida denp.mean()
es siempre flotante. ¿Es eso correcto?1
generalmente se refiere a filas y2
generalmente se refiere a columnas. Reducir el índice "sobre"1
significa reducir por filas.[1., 2.]
es justo[ <row 1 mean> , <row 2 mean> ]
.Esta convención de numeración de índices es típica del software de estadísticas, especialmente R.
fuente