python numpy machine-learning mean tensorflow

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í:

  1. 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
  2. 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.
  3. 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
  4. 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. Si None (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.