2016-09-30 5 views
3

In Tensorflow habe ich ein Klassifikatornetzwerk und unausgewogene Trainingsklassen. Aus verschiedenen Gründen kann ich Resampling nicht verwenden, um die unsymmetrischen Daten zu kompensieren. Daher bin ich gezwungen, das Ungleichgewicht auf andere Weise zu kompensieren, indem ich die Logits mit Gewichten multipliziere, die auf der Anzahl der Beispiele in jeder Klasse basieren. Ich weiß, dass dies nicht der bevorzugte Ansatz ist, aber Resampling ist keine Option. Mein Trainingsverlust ist tf.nn.softmax_cross_entropy_with_logits (ich könnte auch versuchen tf.nn.sparse_softmax_cross_entropy_with_logits). Die Tensorflow docs enthält die folgende in der Beschreibung dieser ops:Tensorflow: skalierte Logits mit Kreuzentropie

ACHTUNG: Diese op unscaled Logits erwartet, da es eine softmax auf Logits intern für Effizienz führt. Rufen Sie diesen Befehl nicht mit dem -Ausgang von softmax auf, da dies zu falschen Ergebnissen führt.

Meine Frage: Ist die Warnung nur oben unter Bezugnahme auf die Skalierung von softmax getan, oder es bedeutet jede logit Skalierung jeglicher Art verboten ist? Wenn letzteres, dann ist meine Klassen-Rebalancing-Logit-Skalierung, die fehlerhafte Ergebnisse verursacht?

Danke,

Ron

+0

Neugierig, ob Sie eine Lösung gefunden haben, die für Sie arbeitet? Ich stehe vor einer ähnlichen Herausforderung und frage mich, wie es anderen gelungen ist, damit umzugehen? –

+0

Ich habe versucht, die Kreuzentropie für jedes Beispiel mit dem Gewicht der wahren Klasse für das Beispiel zu multiplizieren, mit fragwürdigen Ergebnissen. Ich habe versucht, die Daten neu zu erfassen. –

Antwort

1

Die Warnung informiert Sie nur, dass tf.nn.softmax_cross_entropy_with_logits eine softmax auf den Eingangs Logits gelten, vor Cross-Entropie zu berechnen. Diese Warnung scheint wirklich zu vermeiden, Softmax zweimal anzuwenden, da die Ergebnisse der Kreuz-Entropie sehr unterschiedlich sein würden. Hier

ist ein Kommentar in den jeweiligen source code, um die Funktion, die tf.nn.softmax_cross_entropy_with_logits implementiert:

// NOTE(touts): This duplicates some of the computations in softmax_op 
// because we need the intermediate (logits -max(logits)) values to 
// avoid a log(exp()) in the computation of the loss. 

Als die Warnung gibt, diese Implementierung zur Verbesserung der Leistung, mit dem Vorbehalt, dass Sie nicht Ihre eigenen setzen sollten softmax Schicht als Eingabe (was in der Praxis etwas bequem ist).

Wenn die erzwungene softmax Ihre Berechnung behindert, könnte vielleicht eine andere API helfen: tf.nn.sigmoid_cross_entropy_with_logits oder vielleicht tf.nn.weighted_cross_entropy_with_logits.


Die Umsetzung scheint nicht, obwohl, um anzuzeigen, dass jede Skalierung das Ergebnis auswirken wird. Ich denke, eine lineare Skalierungsfunktion sollte in Ordnung sein, solange sie die ursprüngliche logits-Aufteilung beibehält. Aber was auch immer für die Eingabe-Logs angewendet wird, tf.nn.softmax_cross_entropy_with_logits wendet eine softmax an, bevor die Kreuz-Entropie berechnet wird.

Verwandte Themen