wake-up-neo.com

Rangabweichung: Rang der Labels (2 erhalten) sollte dem Logit-Rang minus 1 entsprechen (2 erhalten)

Ich baue DNN, um vorherzusagen, ob das Objekt im Bild vorhanden ist oder nicht. Mein Netzwerk hat zwei verborgene Ebenen und die letzte Schicht sieht folgendermaßen aus:

  # Output layer
  W_fc2 = weight_variable([2048, 1])
  b_fc2 = bias_variable([1])

  y = tf.matmul(h_fc1, W_fc2) + b_fc2

Dann habe ich Platzhalter für Etiketten:

y_ = tf.placeholder(tf.float32, [None, 1], 'Output')

Ich führe Schulungen in Batches durch (daher ist das erste Argument in der Ausgabeebenenform "Keine"). 

Ich benutze folgende Verlustfunktion:

cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(
    y[:, :1], y_[:, :1], name='xentropy')
loss = tf.reduce_mean(cross_entropy, name='xentropy_mean')
predict_hand = tf.greater(y, 0.5)
correct_prediction = tf.equal(tf.to_float(predict_hand), y_)
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

Zur Laufzeit bekam ich jedoch folgenden Fehler:

Rangabweichung: Rang der Labels (erhalten 2) sollte dem Rang der Logits entsprechen minus 1 (erhielt 2).

Ich denke, ich sollte die Etikettenebene umformen, aber nicht sicher, was sie erwartet. Ich habe in Dokumentation nachgeschlagen und es heißt:

logits: Unskalierte Log-Wahrscheinlichkeiten von Rang r und Shape [d_0, d_1, ..., d_ {r-2}, num_classes] und dtype float32 oder float64. Etiketten: Tensor von shape [d_0, d_1, ..., d_ {r-2}] und dtype int32 oder int64. Jeder Eintrag in Labels müssen ein Index in [0, num_classes) sein.

Wenn ich nur eine einzige Klasse habe, wie sollten meine Etiketten aussehen (jetzt nur 0 oder 1)? Jede Hilfe geschätzt

6

Aus der Dokumentation * für tf.nn.sparse_softmax_cross_entropy_with_logits

"Ein häufiger Anwendungsfall besteht darin, dass Logits der Form [batch_size, Num_classes] und Beschriftungen der Form [batch_size] vorhanden sind. Höhere Dimensionen Werden jedoch unterstützt."

Ich nehme an, Ihr Tensor sollte die Form [None] haben. Beachten Sie, dass ein bestimmter Tensor mit der Form [None, 1] oder der Form [None] dieselbe Anzahl von Elementen enthält.

Beispieleingabe mit konkreten Dummy-Werten:

>>> logits = np.array([[11, 22], [33, 44], [55, 66]])
>>> labels = np.array([1, 0, 1])

Wo es 3 Beispiele im Mini-Stapel gibt, sind die logits für das erste Beispiel 11 und 22 und es gibt 2 Klassen: 0 und 1.

* https://www.tensorflow.org/versions/r0.11/api_docs/python/nn.html#sparse_softmax_cross_entropy_with_logits

6

Das Problem kann die Aktivierungsfunktion in Ihrem Netzwerk sein. Verwenden Sie tf.nn.softmax_cross_entropy_with_logits anstelle von sparse_softmax. Dies löst das Problem.

4
Rubens_Z

Kurz gesagt, hier sind Implementierungen davon

    cost = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(
            logits=hypothesis,labels=tf.argmax(Y,1)))

sparse_softmax_cross_entropy_with_logits

Berechnet die Softmax-Kreuzentropie mit geringer Dichte zwischen Logits und Labels.

Misst den Wahrscheinlichkeitsfehler in diskreten Klassifizierungsaufgaben in wobei die Klassen sich gegenseitig ausschließen (jeder Eintrag befindet sich in genau einer Klasse ). 

Zum Beispiel ist jedes CIFAR-10-Bild mit nur einem .__ gekennzeichnet. Etikett: Ein Bild kann ein Hund oder ein Lastwagen sein, aber nicht beide.

HINWEIS: Für diese Operation ist die Wahrscheinlichkeit eines bestimmten Labels als exklusiv betrachtet. Das heißt, Soft-Klassen sind nicht erlaubt, und der Beschriftungsvektor muss einen einzelnen spezifischen Index für die .__ bereitstellen. wahre Klasse für jede Zeile von Logits (für jeden Minibatch-Eintrag). 

Für Soft-Softmax-Klassifizierung mit einer Wahrscheinlichkeitsverteilung Für jeden Eintrag siehe softmax_cross_entropy_with_logits.

WARNUNG: Diese Operation erwartet nicht skalierte Logits, da sie einen softmax .__ ausführt. auf logits intern zur effizienz. Rufe diese op nicht mit der .__ auf. Ausgabe von Softmax, da dies zu falschen Ergebnissen führt.

Ein häufiger Anwendungsfall besteht darin, dass Logits der Form [batch_size, num_classes] .__ vorhanden sind. und Beschriftungen der Form [batch_size]. Höhere Dimensionen werden jedoch unterstützt.

Beachten Sie, dass zur Vermeidung von Verwirrung nur der Name .__ übergeben werden muss. Argumente für diese Funktion.

softmax_cross_entropy_with_logits_v2 und softmax_cross_entropy_with_logits

Berechnet die Softmax-Kreuzentropie zwischen Logits und Labels. (veraltet)

DIESE FUNKTION IS ABGELEHNT. Es wird in einer zukünftigen Version entfernt. 

Anweisungen zum Aktualisieren:

Zukünftige Hauptversionen von TensorFlow werden den Verlauf von Gradienten in .__ ermöglichen. Die Etiketten werden standardmäßig auf backprop eingegeben. Backpropagation wird geschehen nur in logits. Berechnen eines Kreuz-Entropie-Verlusts, mit dem Backpropagation sowohl in Logits als auch in Labels, siehe softmax_cross_entropy_with_logits_v2

Misst den Wahrscheinlichkeitsfehler in diskreten Klassifizierungsaufgaben in Die Klassen schließen sich gegenseitig aus (jeder Eintrag befindet sich in genau einer Klasse). 

Beispielsweise ist jedes CIFAR-10-Bild mit nur einem .__ gekennzeichnet. Etikett: Ein Bild kann ein Hund oder ein Lastwagen sein, aber nicht beide.

Hier sind die gleichen Implementierungen von softmax_cross_entropy_with_logits_v2

    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(
            logits=hypothesis,labels=Y))
1
Hong Cheng

Warum soll

"Ein häufiger Anwendungsfall besteht darin, dass Logits der Form [batch_size, num_classes] und Beschriftungen der Form [batch_size] vorliegen. Es werden jedoch auch höhere Dimensionen unterstützt.

In vielen Tutorials, einschließlich hier und hier , haben die Labels die Größe [None,10] und die Logits die Größe [None,10].

1
Nicky Lim