webentwicklung-frage-antwort-db.com.de

Keras: Verwirrung durch binäre Kreuzung

Nachdem ich TensorFlow längere Zeit verwendet hatte, habe ich einige Keras-Tutorials gelesen und einige Beispiele implementiert. Ich habe mehrere Tutorials für Faltungsauto-Kodierer gefunden, die keras.losses.binary_crossentropy als Verlustfunktion verwenden.

Ich dachte, binary_crossentropy sollte nicht eine Multi-Class-Loss-Funktion sein und höchstwahrscheinlich binäre Labels verwenden. Tatsächlich ruft Keras (TF Python-Backend) tf.nn.sigmoid_cross_entropy_with_logits auf, die eigentlich für Klassifizierungsaufgaben mit mehreren unabhängigen Klassen gedacht ist nicht sich gegenseitig ausschließen.

Auf der anderen Seite sollte meine Erwartung für categorical_crossentropy für Multi-Class-Klassifizierungen gedacht sein, bei denen Zielklassen eine Abhängigkeit voneinander haben, aber nicht notwendigerweise One-Hot-codiert sind.

In der Keras-Dokumentation heißt es jedoch:

(...) Wenn Sie den Verlust von categorical_crossentropy verwenden, sollten Ihre Ziele in kategorialem Format sein (z. B. wenn Sie 10 Klassen haben, sollte das Ziel für jede Probe ein 10-dimensionaler Vektor sein, der alle Nullen für eine 1 erwartet der Index, der der Klasse der Stichprobe entspricht).

Wenn ich mich nicht irre, ist dies nur der Spezialfall von One-Hot-kodierten Klassifizierungsaufgaben, aber der zugrunde liegende Entropieabfall funktioniert auch mit Wahrscheinlichkeitsverteilungen ("Multi-Class", abhängige Labels).

Darüber hinaus verwendet Keras tf.nn.softmax_cross_entropy_with_logits (TF-Python-Backend) für die Implementierung, die sich selbst state :

HINWEIS: Während sich die Klassen gegenseitig ausschließen, müssen ihre Wahrscheinlichkeiten nicht sein. Alles was erforderlich ist, ist, dass jede Zeile von Labels eine gültige Wahrscheinlichkeitsverteilung ist. Wenn dies nicht der Fall ist, wird die Berechnung des Gradienten falsch sein.

Bitte korrigieren Sie mich, wenn ich falsch liege, aber es scheint mir, dass die Keras-Dokumentation - zumindest - nicht sehr detailliert ist ?!

Was ist also die Idee hinter Keras 'Benennung der Verlustfunktionen? Ist die Dokumentation korrekt? Wenn die binäre Kreuzentropie wirklich auf binäre Labels angewiesen wäre, sollte sie nicht für Auto-Encoder funktionieren, oder?! Ebenso sollte die kategoriale Kreuztropie: nur für One-Hot-codierte Labels funktionieren, wenn die Dokumentation korrekt ist ?!

7
daniel451

Sie haben Recht, wenn Sie Bereiche definieren, in denen jeder dieser Verluste gilt:

  • binary_crossentropy (und tf.nn.sigmoid_cross_entropy_with_logits unter der Haube) ist für die Klassifizierung binäres Multi-Label (Labels sind unabhängig).
  • categorical_crossentropy (und tf.nn.softmax_cross_entropy_with_logits unter der Haube) ist für die Klassifizierung Mehrfachklasse (Klassen sind exklusiv).

Siehe auch die detaillierte Analyse in diese Frage .

Ich bin nicht sicher, welche Tutorials Sie meinen, also kann ich nicht kommentieren, ob binary_crossentropy eine gute oder schlechte Wahl für Auto-Encoder ist.

Die Benennung ist absolut korrekt und vernünftig. Oder denken Sie, dass sigmoid und softmax Namen besser klingen?

Die einzige Verwirrung in Ihrer Frage ist also die categorical_crossentropy-Dokumentation. Beachten Sie, dass alles, was angegeben wurde, korrekt ist: Der Verlust unterstützt die One-Hot-Darstellung. Diese Funktion in der Tat funktioniert mit jeder Wahrscheinlichkeitsverteilung für Labels (zusätzlich zu One-Hot-Vektoren) im Falle eines Tensorflow-Backends und könnte in das Dokument aufgenommen werden, dies ist jedoch nicht der Fall für mich kritisch aussehen. Darüber hinaus müssen Sie prüfen, ob Soft-Klassen in anderen Backends, dh in CNTK und in CNTK, unterstützt werden. Denken Sie daran, dass Keras versuchen, für die gängigsten Anwendungsfälle minimalistisch und zielgerichtet zu sein, sodass ich die Logik hier verstehen kann.

4
Maxim

Nicht sicher, ob Ihre Frage damit beantwortet wird, aber für den Softmax-Verlust muss die Ausgabeschicht eine Wahrscheinlichkeitsverteilung sein (d. H. Die Summe zu 1), für den binären Crossentropy-Verlust nicht. So einfach ist das. (Binär bedeutet nicht, dass es nur zwei Ausgabeklassen gibt; es bedeutet nur, dass jeder Ausgang binär ist.)

1
maxymoo