Logits bedeutet einfach, dass die Funktion mit der nicht skalierten Ausgabe früherer Ebenen arbeitet und dass die relative Skalierung zum Verständnis der Einheiten linear ist. Dies bedeutet insbesondere, dass die Summe der Eingaben möglicherweise nicht gleich 1 ist und die Werte keine Wahrscheinlichkeiten sind (möglicherweise haben Sie eine Eingabe von 5).
tf.nn.softmax
erzeugt nur das Ergebnis der Anwendung der Softmax-Funktion auf einen Eingangstensor. Der Softmax "quetscht" die Eingaben so, dass sum(input) = 1
: es eine Art der Normalisierung ist. Die Form der Ausgabe eines Softmax entspricht der Eingabe: Es werden nur die Werte normalisiert. Die Ausgaben von Softmax können als Wahrscheinlichkeiten interpretiert werden.
a = tf.constant(np.array([[.1, .3, .5, .9]]))
print s.run(tf.nn.softmax(a))
[[ 0.16838508 0.205666 0.25120102 0.37474789]]
Im Gegensatz dazu wird tf.nn.softmax_cross_entropy_with_logits
die Kreuzentropie des Ergebnisses nach Anwendung der Softmax-Funktion berechnet (dies geschieht jedoch mathematisch sorgfältiger). Es ähnelt dem Ergebnis von:
sm = tf.nn.softmax(x)
ce = cross_entropy(sm)
Die Kreuzentropie ist eine zusammenfassende Metrik: Sie summiert sich über die Elemente. Die Ausgabe tf.nn.softmax_cross_entropy_with_logits
eines [2,5]
Formtensors hat eine Form [2,1]
(die erste Dimension wird als Charge behandelt).
Wenn Sie eine Optimierung durchführen möchten, um die Kreuzentropie zu minimieren, UND Sie nach Ihrer letzten Ebene Softmaxing durchführen, sollten Sie diese verwenden, tf.nn.softmax_cross_entropy_with_logits
anstatt sie selbst auszuführen , da sie numerisch instabile Eckfälle auf mathematisch richtige Weise abdeckt. Andernfalls hacken Sie es am Ende, indem Sie hier und da kleine Epsilons hinzufügen.
Bearbeitet am 07.02.2016:
Wenn Sie Beschriftungen für eine Klasse haben, bei denen ein Objekt nur zu einer Klasse gehören kann, sollten Sie jetzt die Verwendung in Betracht ziehen, tf.nn.sparse_softmax_cross_entropy_with_logits
damit Sie Ihre Beschriftungen nicht in ein dichtes One-Hot-Array konvertieren müssen. Diese Funktion wurde nach Release 0.6.0 hinzugefügt.
cross_entropy = tf.nn.softmax_cross_entropy_with_logits(tf.nn.softmax(tf.add(tf.matmul(x,W),b)),y) cost=tf.reduce_mean(cross_entropy)
. Aber wenn ich einen anderen Weg benutze, istpred=tf.nn.softmax(tf.add(tf.matmul(x,W),b)) cost =tf.reduce_mean(-tf.reduce_sum(y*tf.log(pred),reduction_indices=1))
das Ergebnis stabil und besser.tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W, b))
in Ihrem Fall.b
außerhalb der Klammer sein muss,tf.nn.softmax_cross_entropy_with_logits(tf.add(tf.matmul(x, W), b)
Kurzfassung:
Angenommen, Sie haben zwei Tensoren,
y_hat
die berechnete Punktzahlen für jede Klasse enthalten (z. B. von y = W * x + b) undy_true
One-Hot-codierte True-Labels enthalten.Wenn Sie die Ergebnisse
y_hat
als nicht normalisierte Protokollwahrscheinlichkeiten interpretieren , handelt es sich um Protokolle .Zusätzlich wird der gesamte Kreuzentropieverlust auf diese Weise berechnet:
ist im Wesentlichen äquivalent zu dem mit der Funktion berechneten Gesamt-Kreuzentropieverlust
softmax_cross_entropy_with_logits()
:Lange Version:
In der Ausgabeschicht Ihres neuronalen Netzwerks berechnen Sie wahrscheinlich ein Array, das die Klassenwerte für jede Ihrer Trainingsinstanzen enthält, z. B. aus einer Berechnung
y_hat = W*x + b
. Als Beispiel habe ich unteny_hat
ein 2 x 3-Array erstellt, in dem die Zeilen den Trainingsinstanzen und die Spalten den Klassen entsprechen. Hier gibt es also 2 Trainingsinstanzen und 3 Klassen.Beachten Sie, dass die Werte nicht normalisiert sind (dh die Zeilen addieren sich nicht zu 1). Um sie zu normalisieren, können wir die Softmax-Funktion anwenden, die die Eingabe als nicht normalisierte Protokollwahrscheinlichkeiten (auch als Logits bezeichnet ) interpretiert und normalisierte lineare Wahrscheinlichkeiten ausgibt.
Es ist wichtig zu verstehen, was die Softmax-Ausgabe sagt. Unten habe ich eine Tabelle gezeigt, die die Ausgabe oben deutlicher darstellt. Es ist ersichtlich, dass beispielsweise die Wahrscheinlichkeit, dass die Trainingsinstanz 1 "Klasse 2" ist, 0,619 beträgt. Die Klassenwahrscheinlichkeiten für jede Trainingsinstanz werden normalisiert, sodass die Summe jeder Zeile 1,0 beträgt.
Jetzt haben wir Klassenwahrscheinlichkeiten für jede Trainingsinstanz, wobei wir den argmax () jeder Zeile verwenden können, um eine endgültige Klassifizierung zu generieren. Von oben können wir erzeugen, dass die Trainingsinstanz 1 zu "Klasse 2" und die Trainingsinstanz 2 zu "Klasse 1" gehört.
Sind diese Klassifikationen korrekt? Wir müssen uns an den wahren Bezeichnungen aus dem Trainingssatz messen. Sie benötigen ein One-Hot-codiertes
y_true
Array, bei dem die Zeilen wiederum Trainingsinstanzen und die Spalten Klassen sind. Im Folgenden habe ich ein Beispiel für einy_true
One-Hot-Array erstellt, bei dem die wahre Bezeichnung für Trainingsinstanz 1 "Klasse 2" und die wahre Bezeichnung für Trainingsinstanz 2 "Klasse 3" lautet.Liegt die Wahrscheinlichkeitsverteilung
y_hat_softmax
nahe an der Wahrscheinlichkeitsverteilung iny_true
? Wir können den Kreuzentropieverlust verwenden , um den Fehler zu messen.Wir können den Kreuzentropieverlust zeilenweise berechnen und die Ergebnisse sehen. Unten sehen wir, dass Trainingsinstanz 1 einen Verlust von 0,479 hat, während Trainingsinstanz 2 einen höheren Verlust von 1,200 hat. Dieses Ergebnis ist sinnvoll, da in unserem obigen Beispiel gezeigt wurde
y_hat_softmax
, dass die höchste Wahrscheinlichkeit für Trainingsinstanz 1 für "Klasse 2" war, die mit Trainingsinstanz 1 in übereinstimmty_true
. Die Vorhersage für Trainingsinstanz 2 zeigte jedoch eine höchste Wahrscheinlichkeit für "Klasse 1", die nicht mit der wahren Klasse "Klasse 3" übereinstimmt.Was wir wirklich wollen, ist der Totalverlust über alle Trainingsinstanzen. So können wir berechnen:
Verwenden von softmax_cross_entropy_with_logits ()
Wir können stattdessen den gesamten Kreuzentropieverlust mit der
tf.nn.softmax_cross_entropy_with_logits()
unten gezeigten Funktion berechnen .Beachten Sie dies
total_loss_1
undtotal_loss_2
erzeugen Sie im Wesentlichen äquivalente Ergebnisse mit einigen kleinen Unterschieden in den letzten Ziffern. Sie können jedoch auch den zweiten Ansatz verwenden: Es wird eine Codezeile weniger benötigt und es werden weniger numerische Fehler akkumuliert, da der Softmax für Sie innerhalb von ausgeführt wirdsoftmax_cross_entropy_with_logits()
.quelle
M = tf.random.uniform([100, 10], minval=-1.0, maxval=1.0); labels = tf.one_hot(tf.random.uniform([100], minval=0, maxval=10 , dtype='int32'), 10); tf.nn.softmax_cross_entropy_with_logits(labels=labels, logits=M) - tf.reduce_sum(-tf.nn.log_softmax(M)*tf.one_hot(labels, 10), -1)
Gibt überall nahe Null zurücktf.nn.softmax
berechnet die Vorwärtsausbreitung durch eine Softmax-Schicht. Sie verwenden es während der Auswertung des Modells, wenn Sie die vom Modell ausgegebenen Wahrscheinlichkeiten berechnen.tf.nn.softmax_cross_entropy_with_logits
berechnet die Kosten für eine Softmax-Schicht. Es wird nur während des Trainings verwendet .Die Protokolle sind die nicht normalisierten Protokollwahrscheinlichkeiten, die das Modell ausgeben (die Werte, die ausgegeben werden, bevor die Softmax-Normalisierung auf sie angewendet wird).
quelle
tf.nn.softmax_cross_entropy_with_logits
geht darum zu bewerten, wie stark das Modell von den Goldetiketten abweicht, und nicht um eine normalisierte Ausgabe zu erzielen.tf.nn.sparse_softmax_cross_entropy_with_logits
. Um Wahrscheinlichkeiten zu erhalten, verwenden Sietf.nn.softmax
.Die obigen Antworten enthalten genügend Beschreibungen für die gestellte Frage.
Darüber hinaus hat Tensorflow den Vorgang der Anwendung der Aktivierungsfunktion optimiert und anschließend die Kosten mithilfe einer eigenen Aktivierung berechnet, gefolgt von Kostenfunktionen. Daher ist es eine gute Praxis zu verwenden:
tf.nn.softmax_cross_entropy()
vorbeitf.nn.softmax(); tf.nn.cross_entropy()
In einem ressourcenintensiven Modell können Sie einen deutlichen Unterschied zwischen ihnen feststellen.
quelle
tf.nn.softmax
gefolgt vontf.losses.softmax_cross_entropy
?Was immer
softmax
passiert , ist logit, das wiederholt J. Hinton die ganze Zeit in Coursera-Videos.quelle
Tensorflow 2.0 kompatibel Antwort : Die Erklärungen
dga
undstackoverflowuser2010
werden über Logits und die damit verbundenen Funktionen sehr detailliert.Alle diese Funktionen funktionieren bei Verwendung in
Tensorflow 1.x
einwandfrei. Wenn Sie jedoch Ihren Code von1.x (1.14, 1.15, etc)
nach migrieren2.x (2.0, 2.1, etc..)
, führt die Verwendung dieser Funktionen zu Fehlern.Daher haben wir die oben beschriebenen 2.0-kompatiblen Aufrufe für alle Funktionen angegeben, wenn wir
1.x to 2.x
zum Nutzen der Community von migrieren .Funktionen in 1.x :
tf.nn.softmax
tf.nn.softmax_cross_entropy_with_logits
tf.nn.sparse_softmax_cross_entropy_with_logits
Entsprechende Funktionen bei der Migration von 1.x auf 2.x :
tf.compat.v2.nn.softmax
tf.compat.v2.nn.softmax_cross_entropy_with_logits
tf.compat.v2.nn.sparse_softmax_cross_entropy_with_logits
Weitere Informationen zur Migration von 1.x auf 2.x finden Sie in diesem Migrationshandbuch .
quelle
Eine weitere Sache, die ich definitiv als logit hervorheben möchte, ist nur eine Rohausgabe, im Allgemeinen die Ausgabe der letzten Ebene. Dies kann auch ein negativer Wert sein. Wenn wir es wie unten erwähnt für die "Kreuzentropie" -Bewertung verwenden:
dann wird es nicht funktionieren. Als Protokoll von -ve ist nicht definiert. Wenn Sie also die Softmax-Aktivierung verwenden, wird dieses Problem behoben.
Dies ist mein Verständnis, bitte korrigieren Sie mich, wenn ich falsch liege.
quelle