Dans le tutoriel de débutant en MNIST , il y a la déclaration
_accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
_
_tf.cast
_ change fondamentalement le type de tenseur de l'objet, mais quelle est la différence entre tf.reduce_mean
et np.mean
?
Voici la doc sur tf.reduce_mean
:
reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)
_
input_tensor
_: Le tenseur à réduire. Devrait avoir un type numérique._
reduction_indices
_: Les dimensions à réduire. SiNone
(le défaut), réduit toutes les 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.]
_
Pour un vecteur 1D, cela ressemble à _np.mean == tf.reduce_mean
_, mais je ne comprends pas ce qui se passe dans tf.reduce_mean(x, 1) ==> [1., 2.]
. tf.reduce_mean(x, 0) ==> [1.5, 1.5]
a un sens, puisque la moyenne de [1,2] et [1,2] correspond à [1.5,1.5] mais que se passe-t-il avec tf.reduce_mean(x,1)
?
Les fonctionnalités de numpy.mean
et tensorflow.reduce_mean
sont identiques. Ils font la même chose. Dans la documentation, pour numpy et tensorflow , vous pouvez le voir. Regardons un exemple,
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)
Sortie
[ 3.5 5.5 6.5]
[ 3.5 5.5 6.5]
Vous pouvez voir ici que lorsque axis
(numpy) ou reduction_indices
(flux tensoriel) vaut 1, il calcule la moyenne entre (3,4) et (5,6) et (6,7), donc 1
définit sur quel axe la moyenne est calculée. Quand il est 0, la moyenne est calculée sur (3,5,6) et (4,6,7), et ainsi de suite. J'espère que vous avez l'idée.
Maintenant, quelles sont les différences entre eux?
Vous pouvez calculer l’opération numpy n’importe où sur python. Mais pour effectuer une opération tensorflow, il faut que ce soit à l'intérieur d'un tensorflow Session
. Vous pouvez en lire plus à ce sujet ici . Ainsi, lorsque vous devez effectuer un calcul pour votre graphe de tensorflow (ou sa structure si vous préférez), vous devez le faire à l'intérieur d'un tensorflow Session
.
Regardons un autre exemple.
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)
Nous pourrions augmenter la moyenne de 1
dans numpy
comme vous le feriez naturellement, mais pour le faire dans tensorflow, vous devez exécuter cela dans Session
, sans utiliser Session
vous ne peut pas faire ça. En d'autres termes, lorsque vous calculez tfMean = tf.reduce_mean(c)
, tensorflow ne le calcule pas alors. Il ne calcule que dans un Session
. Mais numpy calcule cela instantanément lorsque vous écrivez np.mean()
.
J'espère que ça a du sens.
La clé ici est Word Word, un concept issu de la programmation fonctionnelle, qui permet à reduction de conserver dans TensorFlow une moyenne mobile des résultats de calculs à partir d’un lot d’entrées.
Si vous n'êtes pas familier avec la programmation fonctionnelle, cela peut sembler mystérieux. Alors voyons d’abord ce que réduit fait. Si on vous donne une liste comme [1,2,5,4] et qu'on vous dit de calculer la moyenne, c'est facile - il suffit de passer le tableau entier à np.mean et vous obtiendrez la moyenne. Mais que se passe-t-il si vous devez calculer la moyenne d'un flux de nombres? Dans ce cas, vous devez d'abord assembler le tableau en le lisant dans le flux, puis appeler np.mean sur le tableau obtenu. Vous devrez alors écrire du code supplémentaire.
Une alternative consiste à utiliser le paradigme de réduction. A titre d'exemple, voyons comment nous pouvons utiliser réduire dans python pour calculer la somme des nombres: reduce(lambda x,y: x+y, [1,2,5,4])
.
Cela fonctionne comme ceci:
Lire la suite ici Programmation fonctionnelle en Python
Pour voir comment cela s’applique à TensorFlow, examinez le bloc de code suivant, qui définit un graphique simple, qui prend un float et calcule la moyenne. Cependant, l’entrée dans le graphique n’est pas un simple float, mais un tableau de float. Reduction_mean calcule la valeur moyenne sur tous ces flottants.
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}))
Ce modèle est pratique lorsque vous calculez des valeurs sur des lots d’images. Regardez L’exemple de MNIST profond où vous voyez du code comme:
correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
La nouvelle documentation indique que tf.reduce_mean()
produit les mêmes résultats que np.mean:
Équivalent à np.mean
Il a aussi absolument les mêmes paramètres que np.mean . Mais voici une différence importante: ils produisent les mêmes résultats uniquement sur les valeurs de type float :
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 vous supprimez la conversion de type, vous verrez des résultats différents
En plus de cela, de nombreuses autres fonctions tf.reduce_
telles que reduce_all
, reduce_any
, reduce_min
, reduce_max
, reduce_prod
produisent les mêmes valeurs que là. analogues numpy. Clairement, parce qu’il s’agit d’opérations, elles ne peuvent être exécutées qu’à l’intérieur de la session.