Diferencia entre np.media y tf.reducir la media en Numpy y Tensorflow?


En el MNIST tutorial para principiantes , hay 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: The tensor to reduce. Should have numeric type.
reduction_indices: The dimensions to reduce. If `None` (the defaut),
    reduces all dimensions.

# '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] son [1.5,1.5] pero ¿qué está pasando con tf.reduce_mean(x,1)?

Author: Engineero, 2015-12-12

4 answers

Las funcionalidades de numpy.mean y tensorflow.reduce_mean son las mismas. Hacen lo mismo. De la documentación, para numpyy tensorflow, se puede 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 reduction_indices(tensorflow) es 1, calcula la media a través de (3,4) y (5,6) y (6,7), por lo que 1 define a través de 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. Me espero que entiendas la idea.

Ahora, ¿cuáles son las diferencias entre ellos?

Puede calcular la operación numpy en cualquier lugar en python. Pero para hacer una operación tensorflow, debe hacerse dentro de un tensorflow Session. Puedes leer más al respecto aquí. Por lo tanto, cuando necesite realizar cualquier cálculo para su gráfico tensorflow(o estructura si lo desea), debe hacerse dentro de un tensorflow Session.

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 aumente la media por 1 en numpy como lo haría naturalmente, pero para hacerlo en tensorflow, necesita realizar eso en Session, sin usar Session no puede hacer eso. En otras palabras, cuando se está computando tfMean = tf.reduce_mean(c), tensorflow no lo calcula entonces. Solo calcula eso en un Session. Pero numpy calcula eso instantáneamente, cuando escribes np.mean().

Espero que tenga sentido.

 77
Author: Shubhashis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-10-02 19:17:13

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 ejecución 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 lo que reduce hace. Si se le dio una lista como [1,2,5,4] y se le dijo que calculara la media, eso es fácil - simplemente pase toda la matriz a np.mala y obtienes la mala. 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 desde la secuencia y luego llamar a np.media en la matriz resultante - tendría que escribir un poco más de código.

Una alternativa es usar el paradigma reducir. Como ejemplo, veamos cómo podemos usar reduce 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 almacenado). reducir almacena el resultado 8.
  3. Paso 3: Lea el siguiente dígito de la lista - 4. Evaluar lambda 8,4 (8 siendo el resultado del paso 2, que reducen almacenado). reducir almacena el resultado 12
  4. Paso 4: Lea el siguiente dígito de la lista - no hay ninguno, así que devuelve el resultado almacenado de 12.

Leer más aquí Programación Funcional en Python

Para ver cómo se aplica esto a TensorFlow, mire el siguiente bloque de código, que define un gráfico simple, que toma un flotador y calcula la media. Sin embargo, la entrada al gráfico no es un solo flotador, sino una matriz de flotadores. El reduce_mean calcula el valor medio sobre 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. Mira El Ejemplo MNIST Profundo donde ves 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))
 8
Author: Nikhil George,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-11 19:58:05

La nueva documentación establece que tf.reduce_mean() produce los mismos resultados que np.media:

Equivalente a np.media

También tiene absolutamente los mismos parámetros que np.media. 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 va a eliminar la conversión de tipos, verá diferentes resultados


Además de esto, muchas otras tf.reduce_ funciones como reduce_all, reduce_any, reduce_min, reduce_max, reduce_prod producir los mismos valores que hay análogos numpy. Claramente, debido a que son operaciones, solo se pueden ejecutar desde el interior de la sesión.

 1
Author: Salvador Dali,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-01 01:19:23

1 normalmente se refiere a filas, y 2 normalmente se refiere a columnas. Reducir el índice" over " 1 significa reducir en sentido de fila.

[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 en R.

 -1
Author: shadowtalker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-12 00:49:39