En el tutorial para principiantes de MNIST , está la declaración
accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
tf.castbásicamente cambia el tipo de tensor del objeto, pero ¿cuál es la diferencia entre tf.reduce_meany 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_meanes multiproceso, generalmente se calcula en su GPU, mientras quenp.meanse calcula en una sola CPU. Además,tfestá diseñado para procesar un lote de datos, mientras quenpactúa sobre una sola instancia de datos.Respuestas:
La funcionalidad de
numpy.meanytensorflow.reduce_meanes 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 que1define 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
1ennumpycomo lo haría naturalmente, pero para hacerlo en tensorflow, debe realizar esoSession, sin usar,Sessionno 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_prodproducen 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_meangarantiza que la salidadtypecoincida con la entradadtype. La salida denp.mean()es siempre flotante. ¿Es eso correcto?1generalmente se refiere a filas y2generalmente se refiere a columnas. Reducir el índice "sobre"1significa 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