Tutte le sfide
Facile 0 risolte 0% di accettazione

Entropia incrociata categoriale

Misura la perdita di un classificatore multiclasse dalle probabilità previste e dalle classi reali.

Cosa imparerai

  • Valutare le probabilità previste rispetto alle classi vere
  • Fare la media della loss sui campioni
  • Evitare log(0) limitando i valori

Problema

Un classificatore multiclasse restituisce una probabilità per classe (per esempio con la softmax). L'entropia incrociata categoriale lo penalizza quando dà una probabilità bassa alla classe corretta:

loss = -(ln(p₁) + ln(p₂) + … + ln(pₙ)) / n

dove pᵢ è la probabilità che il modello ha dato alla classe corretta dell'esempio i. Per evitare ln(0), porta prima a 0.0000001 ogni probabilità inferiore a 0.0000001.

Implementa categorical_cross_entropy(probabilities, labels).

Input

probabilities: Una riga per esempio, con una probabilità per classe.

labels: L'indice della classe corretta di ogni esempio (a partire da 0).

Output

Restituisci la perdita media come numero decimale.

Vincoli

1 ≤ esempi ≤ 1.000, 2 ≤ classi ≤ 100

0 ≤ ogni probabilità ≤ 1

0 ≤ labels[i] < numero di classi

Esempi

Esempio 1
Input:
labels = [0, 1]
probabilities = [
    [0.7, 0.2, 0.1],
    [0.1, 0.8, 0.1]
]

Output atteso:
expected = 0.289909
Input:
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}
};

Output atteso:
double expected = 0.289909;
Input:
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}
};

Output atteso:
double expected = 0.289909;

Spiegazione

Le classi corrette hanno ricevuto 0.7 e 0.8: -(ln(0.7) + ln(0.8)) / 2 = -(-0.356675 - 0.223144) / 2 ≈ 0.289909.

Esempio 2
Input:
labels = [1]
probabilities = [
    [1.0, 0.0]
]

Output atteso:
expected = 16.118096
Input:
std::vector<long long> labels = {1};
std::vector<std::vector<double>> probabilities = {
    {1.0, 0.0}
};

Output atteso:
double expected = 16.118096;
Input:
long[] labels = new long[] {1};
double[][] probabilities = new double[][] {
    new double[] {1.0, 0.0}
};

Output atteso:
double expected = 16.118096;

Spiegazione

La classe corretta ha ricevuto probabilità 0, portata a 0.0000001, quindi la perdita è -ln(0.0000001) ≈ 16.118096: una risposta sbagliata data con sicurezza viene punita duramente.

Riferimenti

Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.