webentwicklung-frage-antwort-db.com.de

Was ist der Unterschied zwischen sparse_softmax_cross_entropy_with_logits und softmax_cross_entropy_with_logits?

Ich bin kürzlich auf tf.nn.sparse_softmax_cross_entropy_with_logits gestoßen und kann nicht herausfinden, mit welchem ​​Unterschied tf.nn.softmax_cross_entropy_with_logits verglichen wird.

Ist der einzige Unterschied, dass Trainingsvektoren yone-hot codiert sein müssen, wenn sparse_softmax_cross_entropy_with_logits Verwendet wird?

Beim Lesen der API konnte ich keinen anderen Unterschied zu softmax_cross_entropy_with_logits Feststellen. Aber warum brauchen wir dann die Zusatzfunktion?

Sollte softmax_cross_entropy_with_logits Nicht die gleichen Ergebnisse wie sparse_softmax_cross_entropy_with_logits Liefern, wenn es mit One-Hot-codierten Trainingsdaten/Vektoren geliefert wird?

95
daniel451

Zwei verschiedene Funktionen zu haben, ist ein Bequemlichkeit, da sie das gleiche Ergebnis liefern.

Der Unterschied ist einfach:

  • Für sparse_softmax_cross_entropy_with_logits Müssen Beschriftungen die Form [batch_size] und den D-Typ int32 oder int64 haben. Jedes Label ist ein Int in Range [0, num_classes-1].
  • Für softmax_cross_entropy_with_logits Müssen Beschriftungen die Form [batch_size, num_classes] und den D-Typ float32 oder float64 haben.

In softmax_cross_entropy_with_logits Verwendete Bezeichnungen sind das eine heiße Version der in sparse_softmax_cross_entropy_with_logits Verwendeten Bezeichnungen.

Ein weiterer winziger Unterschied ist, dass Sie mit sparse_softmax_cross_entropy_with_logits -1 als Label angeben können, um einen Verlust 0 Auf diesem Label zu haben.

161

Ich möchte nur 2 Dinge zur akzeptierten Antwort hinzufügen, die Sie auch in der TF-Dokumentation finden.

Zuerst:

tf.nn.softmax_cross_entropy_with_logits

HINWEIS: Während sich die Klassen gegenseitig ausschließen, müssen ihre Wahrscheinlichkeiten nicht sein. Erforderlich ist lediglich, dass jede Etikettenreihe eine gültige Wahrscheinlichkeitsverteilung ist. Ist dies nicht der Fall, ist die Berechnung des Verlaufs falsch.

Zweite:

tf.nn.sparse_softmax_cross_entropy_with_logits

HINWEIS: Für diesen Vorgang wird die Wahrscheinlichkeit eines bestimmten Etiketts als exklusiv betrachtet. Das heißt, weiche Klassen sind nicht zulässig, und der Beschriftungsvektor muss für jede Zeile von Protokollen (jeden Minibatch-Eintrag) einen einzelnen spezifischen Index für die wahre Klasse bereitstellen.

24
Drag0

Beide Funktionen berechnen die gleichen Ergebnisse und sparse_softmax_cross_entropy_with_logits berechnet die Querentropie direkt auf den sparse-Labels, anstatt sie mit One-Hot-Codierung zu konvertieren.

Sie können dies überprüfen, indem Sie das folgende Programm ausführen:

import tensorflow as tf
from random import randint

dims = 8
pos  = randint(0, dims - 1)

logits = tf.random_uniform([dims], maxval=3, dtype=tf.float32)
labels = tf.one_hot(pos, dims)

res1 = tf.nn.softmax_cross_entropy_with_logits(       logits=logits, labels=labels)
res2 = tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=tf.constant(pos))

with tf.Session() as sess:
    a, b = sess.run([res1, res2])
    print a, b
    print a == b

Hier erstelle ich einen zufälligen logits Vektor der Länge dims und erstelle one-hot-codierte Labels (wobei das Element in pos 1 ist und andere 0 sind).

Danach berechne ich Softmax und sparsamen Softmax und vergleiche deren Ausgabe. Führen Sie es einige Male erneut aus, um sicherzustellen, dass immer die gleiche Ausgabe erfolgt

19
Salvador Dali