webentwicklung-frage-antwort-db.com.de

Wie kann ich einen gewichteten Cross-Entropie-Verlust im Tensorflow mithilfe von sparse_softmax_cross_entropy_with_logits implementieren?

Ich beginne mit Tensorflow (kommt von Caffe) und benutze den Verlust sparse_softmax_cross_entropy_with_logits. Die Funktion akzeptiert Beschriftungen wie 0,1,...C-1 anstelle von Onehot-Kodierungen. Nun möchte ich je nach Klassenbezeichnung eine Gewichtung verwenden. Ich weiß, dass dies möglicherweise mit einer Matrixmultiplikation durchgeführt werden kann, wenn ich softmax_cross_entropy_with_logits (eine heiße Kodierung) verwende. Gibt es eine Möglichkeit, dasselbe mit sparse_softmax_cross_entropy_with_logits zu tun?

8
Roger Trullo
import  tensorflow as tf
import numpy as np

np.random.seed(123)
sess = tf.InteractiveSession()

# let's say we have the logits and labels of a batch of size 6 with 5 classes
logits = tf.constant(np.random.randint(0, 10, 30).reshape(6, 5), dtype=tf.float32)
labels = tf.constant(np.random.randint(0, 5, 6), dtype=tf.int32)

# specify some class weightings
class_weights = tf.constant([0.3, 0.1, 0.2, 0.3, 0.1])

# specify the weights for each sample in the batch (without having to compute the onehot label matrix)
weights = tf.gather(class_weights, labels)

# compute the loss
tf.losses.sparse_softmax_cross_entropy(labels, logits, weights).eval()
14
mauna

Speziell für die binäre Klassifizierung gibt es weighted_cross_entropy_with_logits , das gewichtete Softmax-Kreuzentropie berechnet.

sparse_softmax_cross_entropy_with_logits ist für eine hocheffiziente, nicht gewichtete Operation ausgelegt (siehe SparseSoftmaxXentWithLogitsOp , die SparseXentEigenImpl unter der Haube verwendet), daher nicht "steckbar".

In Fällen mit mehreren Klassen besteht die Möglichkeit, entweder auf One-Hot-Codierung umzuschalten, oder, wie bereits vorgeschlagen, die tf.losses.sparse_softmax_cross_entropy loss-Funktion auf eine harte Art und Weise zu verwenden, bei der Sie die Gewichte je nach Beschriftung in einer aktuellen Charge übergeben müssen .

2
Maxim

Die Klassengewichtungen werden mit den Logits multipliziert, so dass dies auch für sparse_softmax_cross_entropy_with_logits funktioniert. Siehe diese Lösung für "Verlustfunktion für Klassenungleichgewichts-Binärklassifizierer im Tensor-Fluss."

Als Randbemerkung können Sie Gewichte direkt in sparse_softmax_cross_entropy übergeben

tf.contrib.losses.sparse_softmax_cross_entropy(logits, labels, weight=1.0, scope=None)

Diese Methode ist für den Entropieverlust verwendet 

tf.nn.sparse_softmax_cross_entropy_with_logits.

Das Gewicht dient als Koeffizient für den Verlust. Wenn ein Skalar bereitgestellt wird, wird der Verlust einfach um den angegebenen Wert skaliert. Wenn das Gewicht ein Tensor der Größe [batch_size] ist, gelten die Verlustgewichte für jede entsprechende Probe.

1
Alexa Greenberg