2017-05-23 4 views
0

Ich möchte Cross-Entropie-Funktion mit dem folgenden Befehl berechnen. Dieser Befehl wendet zuerst sofmax auf die Logits an und wendet dann die Kreuz-Entropiefunktion an. Nach der Formel der Kreuz-Entropiesumme (b * loga) ist b die korrekte Markierung und a ist die vorhergesagte Markierung. Da die Summe aller Klassen in der Kreuz-Entropie-Formel übernommen wird, erwarte ich, dass die Multiplikation so weitergeht. Wenn nach der sofmax Betriebsausgabetf.nn.softmax_cross_entropy_with_logits gibt falsche Ausgabe. Warum?

[0.45186275 0.27406862 0.27406862] 

Nun ist, wenn ich Kreuz anwenden Entropie sollte es so sein

(1 * log 0.45186275 + 0 * log 0.27406862 + 0 * log 0.27406862) 

Meine Ausgabe ist 0,794377 aber ich erwarte eine andere

a = tf.constant([0.9,0.4,0.4]) 
b = tf.constant([1,0,0]) 
result = tf.nn.softmax_cross_entropy_with_logits(logits=a,labels=b) 
sess = tf.InteractiveSession() 
sess.run(tf.initialize_all_variables()) 
print result.eval() 

Antwort

1

Ich glaube, dass tf.nn.softmax_cross_entropy_with_logits berechnet Summe (-blog (softmax (a))) -ish und die gewünschte Ausgabe ist 0.794377. Wenn Sie das negative Zeichen nicht manuell eingeben, erhalten Sie -0.794377, was als Verlustbedingung funktioniert, aber Sie müssen Ihren Verlust maximieren, nicht minimieren, wenn Sie trainieren.

Es ist auch wichtig, dass TF verwendet natürliche Protokoll zu beachten, und nicht einloggen Basis 10

+0

Aber (1 * log 0,45186275 + 0 * log 0,27406862 + 0 * 0,27406862 log) nach dieser Multiplikation ich bin 0,344 bekommen weil der Rest des Begriffs Null ist. –

+0

Natürliches Protokoll, nicht Basis zehn. – Wontonimo

+0

Jetzt ist es richtig. Danke –