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

89

Im MNIST-Anfänger-Tutorial gibt es die Aussage

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

tf.castÄndert grundsätzlich die Art des Tensors, der das Objekt ist, aber was ist der Unterschied zwischen tf.reduce_meanund np.mean?

Hier ist das Dokument über 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 reduzierenden Abmessungen. Wenn None(der Defaut), reduziert alle Dimensionen.

# '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 so aus np.mean == tf.reduce_mean, aber ich verstehe nicht, was passiert tf.reduce_mean(x, 1) ==> [1., 2.]. tf.reduce_mean(x, 0) ==> [1.5, 1.5]Art macht Sinn, da gemein [1, 2]und [1, 2]ist [1.5, 1.5], aber was ist los mit tf.reduce_mean(x, 1)?

O.rka
quelle
Aufgrund der Division in Python
Salvador Dali
Ein wichtiger Unterschied für Tensorflow-Neulinge: tf.reduce_meanMultithreading, das normalerweise auf Ihrer GPU np.meanberechnet wird , während es auf einer einzelnen CPU berechnet wird. Auch tfsoll eine zur Verarbeitung Charge von Daten , während npauf einer einzigen Dateninstanz fungiert.
Drevicko

Antworten:

109

Die Funktionalität von numpy.meanund tensorflow.reduce_meansind gleich. Sie machen das Gleiche. In der Dokumentation für Numpy und Tensorflow können Sie das sehen. 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, der Mittelwert über (3,4) und (5,6) und (6,7) 1berechnet wird , also definiert, über welche Achse der Mittelwert berechnet wird. Wenn es 0 ist, wird der Mittelwert über (3,5,6) und (4,6,7) usw. berechnet. Ich hoffe du kommst auf die Idee.

Was sind nun die Unterschiede zwischen ihnen?

Sie können die Numpy-Operation überall in Python berechnen. Um jedoch einen Tensorflow-Vorgang durchzuführen, muss dieser innerhalb eines Tensorflusses durchgeführt werden Session. Sie können mehr darüber lesen Sie hier . Wenn Sie also eine Berechnung für Ihr Tensorflow-Diagramm (oder eine Struktur, wenn Sie so wollen) durchführen müssen, muss dies innerhalb eines Tensorflow erfolgen Session.

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 von 1in erhöhen, numpywie Sie es natürlich tun würden, aber um dies im Tensorflow zu tun, müssen Sie dies in ausführen Session, ohne dass SessionSie dies nicht tun können. Mit anderen Worten, wenn Sie tfMean = tf.reduce_mean(c)rechnen, berechnet Tensorflow dies dann nicht. Es berechnet nur das in a Session. Aber numpy berechnet das sofort, wenn Sie schreiben np.mean().

Ich hoffe es macht Sinn.

Shubhashis
quelle
21
aber was bedeutet hier Teil reduzieren ?
rsht
20
@ Roman ist ein Begriff aus der funktionalen Programmierung. Sie können hier darüber lesen: python-course.eu/lambda.php
Daniyar
1
@rsht REDUCE = Reduziert die Zahlen durch Summieren auf 1 Wert. MEAN = Mittelung dieser Summe.
Meghna Natraj
1
@rsht Stellen Sie sich vor, Sie haben N Elemente und möchten den Mittelwert (M) dieser N Zahlen berechnen. Eine Möglichkeit, dieses Problem zu erkennen, besteht darin, dass wir einen Vektor der Größe (1, N) haben und über der Achse = 0 die Elemente reduzieren (hier haben wir N Elemente). Die Reduktion (oder Aggregation) ist mit einer Funktionalität verbunden, und in unserem Beispiel ist die Funktion die mittlere Funktion.
am
21

Der Schlüssel hier ist das Wort Reduzieren, ein Konzept aus der funktionalen Programmierung, das es Reduce_Mean in TensorFlow ermöglicht, einen laufenden Durchschnitt der Ergebnisse von Berechnungen aus einer Reihe von Eingaben zu erhalten.

Wenn Sie mit der funktionalen Programmierung nicht vertraut sind, kann dies mysteriös erscheinen. Lassen Sie uns zuerst sehen, was Reduzieren bewirkt. Wenn Sie eine Liste wie [1,2,5,4] erhalten haben und aufgefordert wurden, den Mittelwert zu berechnen, ist das einfach - übergeben Sie einfach das gesamte Array an np.mean und Sie erhalten den Mittelwert. Was wäre, wenn Sie den Mittelwert eines Zahlenstroms berechnen müssten? In diesem Fall müssten Sie zuerst das Array zusammenstellen, indem Sie aus dem Stream lesen, 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 Reduce in Python verwenden können, um die Summe der Zahlen zu berechnen : reduce(lambda x,y: x+y, [1,2,5,4]).

Es funktioniert so:

  1. Schritt 1: Lesen Sie 2 Ziffern aus der Liste - 1,2. Bewerten Sie Lambda 1,2. Reduzieren speichert das Ergebnis 3. 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 Speicherung reduziert). Reduzieren 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, der die Speicherung reduziert). Reduzieren speichert das Ergebnis 12
  4. Schritt 4: Lesen Sie die nächste Ziffer aus der Liste - es gibt keine, geben Sie also das gespeicherte Ergebnis von 12 zurück.

Lesen Sie hier mehr Funktionale Programmierung in Python

Um zu sehen, wie dies auf TensorFlow zutrifft, sehen Sie sich den folgenden Codeblock an, der ein einfaches Diagramm definiert, das einen Float aufnimmt und den Mittelwert berechnet. Die Eingabe in das Diagramm ist jedoch kein einzelner Float, sondern ein Array von Floats. Der redu_mean berechnet den Mittelwert über alle diese Floats.

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 praktisch, wenn Werte über mehrere Bildstapel berechnet werden. Schauen Sie sich das Deep MNIST-Beispiel an, in dem Sie Code wie folgt sehen:

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

In der neuen Dokumentation heißt es, dass tf.reduce_mean()dieselben Ergebnisse wie bei np.mean erzielt werden:

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 bei Float-Werten :

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 sind viele andere tf.reduce_Funktionen wie reduce_all,reduce_any , reduce_min, reduce_max, reduce_prodproduzieren die gleichen Werte wie es numpy Analoga. Da es sich um Vorgänge handelt, können sie nur innerhalb der Sitzung ausgeführt werden.

Salvador Dali
quelle
Es kann hilfreich sein, wenn Sie zusätzlich zum Beispiel den Unterschied erläutern. Durch das Ausführen Ihres Beispiels habe ich den Eindruck, dass tf.reduce_meansichergestellt ist, dass die Ausgabe dtypemit der Eingabe übereinstimmt dtype. Die Ausgabe von np.mean()ist immer ein Float. Ist das korrekt?
Craq
-1

1bezieht sich normalerweise auf Zeilen und 2normalerweise auf Spalten. Das Reduzieren des "Über" -Index 1bedeutet das Reduzieren in Zeilen.

[1., 2.]ist einfach [ <row 1 mean> , <row 2 mean> ].

Diese Indexnummerierungskonvention ist typisch für Statistiksoftware, insbesondere R.

Shadowtalker
quelle
Ich glaube, 0 bezieht sich auf Spalte, nicht 2
hfz