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_mean
und 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. WennNone
(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)
?
tf.reduce_mean
Multithreading, das normalerweise auf Ihrer GPUnp.mean
berechnet wird , während es auf einer einzelnen CPU berechnet wird. Auchtf
soll eine zur Verarbeitung Charge von Daten , währendnp
auf einer einzigen Dateninstanz fungiert.Antworten:
Die Funktionalität von
numpy.mean
undtensorflow.reduce_mean
sind gleich. Sie machen das Gleiche. In der Dokumentation für Numpy und Tensorflow können Sie das sehen. Schauen wir uns ein Beispiel an:Ausgabe
Hier können Sie sehen, dass wenn
axis
(numpy) oderreduction_indices
(tensorflow) 1 ist, der Mittelwert über (3,4) und (5,6) und (6,7)1
berechnet 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 erfolgenSession
.Schauen wir uns ein anderes Beispiel an.
Wir könnten den Mittelwert von
1
in erhöhen,numpy
wie Sie es natürlich tun würden, aber um dies im Tensorflow zu tun, müssen Sie dies in ausführenSession
, ohne dassSession
Sie dies nicht tun können. Mit anderen Worten, wenn SietfMean = tf.reduce_mean(c)
rechnen, berechnet Tensorflow dies dann nicht. Es berechnet nur das in aSession
. Aber numpy berechnet das sofort, wenn Sie schreibennp.mean()
.Ich hoffe es macht Sinn.
quelle
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:
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.
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:
quelle
In der neuen Dokumentation heißt es, dass
tf.reduce_mean()
dieselben Ergebnisse wie bei np.mean erzielt werden: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 :
Wenn Sie die Typkonvertierung entfernen, werden unterschiedliche Ergebnisse angezeigt
Darüber hinaus sind viele andere
tf.reduce_
Funktionen wiereduce_all
,reduce_any
,reduce_min
,reduce_max
,reduce_prod
produzieren die gleichen Werte wie es numpy Analoga. Da es sich um Vorgänge handelt, können sie nur innerhalb der Sitzung ausgeführt werden.quelle
tf.reduce_mean
sichergestellt ist, dass die Ausgabedtype
mit der Eingabe übereinstimmtdtype
. Die Ausgabe vonnp.mean()
ist immer ein Float. Ist das korrekt?1
bezieht sich normalerweise auf Zeilen und2
normalerweise auf Spalten. Das Reduzieren des "Über" -Index1
bedeutet das Reduzieren in Zeilen.[1., 2.]
ist einfach[ <row 1 mean> , <row 2 mean> ]
.Diese Indexnummerierungskonvention ist typisch für Statistiksoftware, insbesondere R.
quelle