web-dev-qa-db-de.com

Was ist der Unterschied zwischen np.mean und tf.reduce_mean?

Im MNIST Anfänger-Tutorial gibt es die Anweisung

accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))

tf.cast Ändert grundsätzlich den Tensortyp des Objekts, aber was ist der Unterschied zwischen tf.reduce_mean und np.mean ?

Hier ist das Dokument zu tf.reduce_mean :

reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)

input_tensor: Der zu reduzierende Tensor. Sollte einen numerischen Typ haben.

reduction_indices: Die zu verkleinernden Maße. Wenn None (die Standardeinstellung), werden alle Dimensionen reduziert.

# '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.]

Für einen 1D-Vektor sieht es aus wie np.mean == tf.reduce_mean, Aber ich verstehe nicht, was in tf.reduce_mean(x, 1) ==> [1., 2.] passiert. tf.reduce_mean(x, 0) ==> [1.5, 1.5] macht irgendwie Sinn, da der Mittelwert von [1,2] und [1,2] [1,5,1,5] ist, aber was ist mit tf.reduce_mean(x,1) los?

75
O.rka

Die Funktionen von numpy.mean Und tensorflow.reduce_mean Sind identisch. Sie machen das Gleiche. Aus der Dokumentation können Sie für numpy und tensorflow das ersehen. Schauen wir uns ein Beispiel an:

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)

Ausgabe

[ 3.5  5.5  6.5]
[ 3.5  5.5  6.5]

Hier können Sie sehen, dass wenn axis (numpy) oder reduction_indices (Tensorflow) 1 ist, es den Mittelwert zwischen (3,4) und (5,6) und (6,7) berechnet, So definiert 1, über welche Achse der Mittelwert berechnet wird. Wenn es 0 ist, wird der Mittelwert über (3,5,6) und (4,6,7) berechnet und so weiter. Ich hoffe du kommst auf die Idee.

Was sind nun die Unterschiede zwischen ihnen?

Sie können die numpy-Operation an einer beliebigen Stelle in Python berechnen. Um eine Tensorflow-Operation auszuführen, muss sie jedoch in einem Tensorflow Session ausgeführt werden. Sie können mehr darüber lesen hier . Wenn Sie also eine Berechnung für Ihr Tensorflow-Diagramm (oder eine Struktur, wenn Sie so wollen) durchführen müssen, muss dies in einem Tensorflow Session erfolgen.

Schauen wir uns ein anderes Beispiel an.

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)

Wir könnten den Mittelwert um 1 In numpy erhöhen, wie Sie es natürlich tun würden, aber um dies im Tensorflow zu tun, müssen Sie dies in Session ausführen, ohne Session das kannst du nicht. Mit anderen Worten, wenn Sie tfMean = tf.reduce_mean(c) berechnen, berechnet es Tensorflow dann nicht. Es wird nur das in einem Session berechnet. Aber numpy berechnet das sofort, wenn Sie np.mean() schreiben.

Ich hoffe es macht Sinn.

94
Shubhashis

Der Schlüssel hier ist Word Reduce, ein Konzept aus der funktionalen Programmierung, mit dem mithilfe von reduct_mean in TensorFlow ein laufender Durchschnitt der Ergebnisse von Berechnungen aus einer Reihe von Eingaben erstellt werden kann.

Wenn Sie mit funktionaler Programmierung nicht vertraut sind, kann dies mysteriös erscheinen. Lassen Sie uns also zuerst sehen, was Reduzieren bewirkt. Wenn Sie eine Liste wie [1,2,5,4] erhalten haben und den Mittelwert berechnen sollen, ist das ganz einfach. Übergeben Sie einfach das gesamte Array an np.mean und Sie erhalten den Mittelwert. Was aber, wenn Sie den Mittelwert eines Zahlenstroms berechnen müssten? In diesem Fall müssten Sie zuerst das Array durch Lesen aus dem Stream zusammenstellen und dann np.mean für das resultierende Array aufrufen - Sie müssten etwas mehr Code schreiben.

Eine Alternative ist die Verwendung des Reduktionsparadigmas. Schauen Sie sich als Beispiel an, wie wir mithilfe von reduct in python) die Summe der Zahlen berechnen können: reduce(lambda x,y: x+y, [1,2,5,4]).

Das funktioniert so:

  1. Schritt 1: Lesen Sie 2 Ziffern aus der Liste - 1,2. Bewerten Sie Lambda 1,2. Beim Reduzieren wird das Ergebnis 3 gespeichert. Hinweis - Dies ist der einzige Schritt, bei dem 2 Ziffern aus der Liste gelesen werden
  2. Schritt 2: Lesen Sie die nächste Ziffer aus der Liste - 5. Bewerten Sie Lambda 5, 3 (3 ist das Ergebnis von Schritt 1, das die gespeicherte Zahl reduziert). reduce speichert das Ergebnis 8.
  3. Schritt 3: Lesen Sie die nächste Ziffer aus der Liste - 4. Bewerten Sie Lambda 8,4 (8 ist das Ergebnis von Schritt 2, das die gespeicherte Zahl reduziert). Reduzieren speichert das Ergebnis 12
  4. Schritt 4: Lesen Sie die nächste Ziffer aus der Liste - es gibt keine, also geben Sie das gespeicherte Ergebnis von 12 zurück.

Lesen Sie hier mehr Funktionale Programmierung in Python

Sehen Sie sich den folgenden Codeblock an, der ein einfaches Diagramm definiert, das einen Gleitkommawert aufnimmt und den Mittelwert berechnet, um zu sehen, wie dies auf TensorFlow zutrifft. Die Eingabe in das Diagramm ist jedoch kein einzelnes Float, sondern ein Array von Floats. Der Parameter redu_mean berechnet den Mittelwert für alle diese Gleitkommazahlen.

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}))

Dieses Muster ist nützlich, wenn Sie Werte über mehrere Bildstapel berechnen. Schauen Sie sich The Deep MNIST Example an, wo Sie folgenden Code sehen:

correct_prediction = tf.equal(tf.argmax(y,1), tf.argmax(y_,1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
15
Nikhil George

Die neue Dokumentation besagt, dass tf.reduce_mean() die gleichen Ergebnisse wie np.mean liefert:

Entspricht np.mean

Es hat auch absolut die gleichen Parameter wie np.mean . Aber hier ist ein wichtiger Unterschied: Sie liefern die gleichen Ergebnisse nur für Float-Werte :

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

Wenn Sie die Typkonvertierung entfernen, werden unterschiedliche Ergebnisse angezeigt


Darüber hinaus viele andere tf.reduce_ Funktionen wie reduce_all, reduce_any, reduce_min, reduce_max, reduce_prod liefern die gleichen Werte wie es zahllose Analoga gibt. Da es sich eindeutig um Vorgänge handelt, können sie nur innerhalb der Sitzung ausgeführt werden.

2
Salvador Dali