Problem
Ein Mehrklassen-Klassifikator gibt pro Klasse eine Wahrscheinlichkeit aus (zum Beispiel per Softmax). Die kategoriale Kreuzentropie bestraft ihn, wenn er der richtigen Klasse eine niedrige Wahrscheinlichkeit gibt:
loss = -(ln(p₁) + ln(p₂) + … + ln(pₙ)) / n
wobei pᵢ die Wahrscheinlichkeit ist, die das Modell der richtigen Klasse von Beispiel i gegeben hat. Um ln(0) zu vermeiden, hebe zuerst jede Wahrscheinlichkeit unter 0.0000001 auf 0.0000001 an.
Implementiere categorical_cross_entropy(probabilities, labels).
Eingabe
probabilities: Eine Zeile pro Beispiel mit einer Wahrscheinlichkeit pro Klasse.
labels: Der Index der richtigen Klasse jedes Beispiels (ab 0).
Ausgabe
Gib den durchschnittlichen Verlust als Dezimalzahl zurück.
Einschränkungen
1 ≤ Beispiele ≤ 1.000, 2 ≤ Klassen ≤ 100
0 ≤ jede Wahrscheinlichkeit ≤ 1
0 ≤ labels[i] < Anzahl der Klassen
Beispiele
Eingabe:
labels = [0, 1]
probabilities = [
[0.7, 0.2, 0.1],
[0.1, 0.8, 0.1]
]
Erwartete Ausgabe:
expected = 0.289909
Eingabe:
std::vector<long long> labels = {0, 1};
std::vector<std::vector<double>> probabilities = {
{0.7, 0.2, 0.1},
{0.1, 0.8, 0.1}
};
Erwartete Ausgabe:
double expected = 0.289909;
Eingabe:
long[] labels = new long[] {0, 1};
double[][] probabilities = new double[][] {
new double[] {0.7, 0.2, 0.1},
new double[] {0.1, 0.8, 0.1}
};
Erwartete Ausgabe:
double expected = 0.289909;
Erläuterung
Die richtigen Klassen erhielten 0.7 und 0.8: -(ln(0.7) + ln(0.8)) / 2 = -(-0.356675 - 0.223144) / 2 ≈ 0.289909.
Eingabe:
labels = [1]
probabilities = [
[1.0, 0.0]
]
Erwartete Ausgabe:
expected = 16.118096
Eingabe:
std::vector<long long> labels = {1};
std::vector<std::vector<double>> probabilities = {
{1.0, 0.0}
};
Erwartete Ausgabe:
double expected = 16.118096;
Eingabe:
long[] labels = new long[] {1};
double[][] probabilities = new double[][] {
new double[] {1.0, 0.0}
};
Erwartete Ausgabe:
double expected = 16.118096;
Erläuterung
Die richtige Klasse erhielt die Wahrscheinlichkeit 0, die auf 0.0000001 angehoben wird, also ist der Verlust -ln(0.0000001) ≈ 16.118096: Eine selbstsichere falsche Antwort wird hart bestraft.
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.