L'entropia incrociata categoriale funziona in modo sbagliato con le caratteristiche codificate a caldo

Aug 18 2020

Non sto lottando con categorical_crossentropy problema con dati di codifica one-hot. Il problema è nell'output invariato del codice che presenta di seguito:

            inputs = keras.Input(shape=(1190,), sparse=True)
            lay_1 = layers.Dense(1190, activation='relu')
            x = lay_1(inputs)
            x = layers.Dense(10, activation='relu')(x)
            out = layers.Dense(1, activation='sigmoid')(x)
            self.model = keras.Model(inputs, out, name='SimpleD2Dense')
            self.model.compile(
                optimizer=keras.optimizers.Adam(),
                loss=tf.losses.categorical_crossentropy,
                metrics=['accuracy']
            )
Epoch 1/3
1572/1572 - 6s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543
Epoch 2/3
1572/1572 - 6s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543
Epoch 3/3
1572/1572 - 7s - loss: 5.7709e-08 - accuracy: 0.5095 - val_loss: 7.0844e-08 - val_accuracy: 0.5543

Qualche parola sui dati: 1190 caratteristiche ( 10 caratteristiche effettive con 119 categorie). Gli input sono righe di un dataframe con 1190 valori per campione. L'output è un valore binario 0 o 1.

Tentativi fatti prima: binary_crossentropy utilizzato con risultati soddisfacenti, tuttavia, il numero di campioni non è sufficiente per ottenere buoni risultati sui dati di convalida. Ho provato a utilizzare diverse attivazioni e dimensioni dei livelli.

La domanda principale è perché categorical_crossentropy non funziona e come usarlo nel modo giusto.

Inoltre, una preoccupazione appare sulla rappresentazione dei dati: è il modo giusto di utilizzare in una rara riga di dati codificati a caldo?

Risposte

10xAI Aug 18 2020 at 13:52

Perché funzioni -

  1. Cambia il conteggio dei neuroni di output a 02
  2. Attivazione dell'uscita a Softmax
  3. Mantieni tutti i vettori dell'output OHE


Questo è il modo in cui Keras è progettato internamente. Lo stesso è stato scritto sulla pagina della documentazione ufficiale

Classe BinaryCrossentropy
Utilizzare questa perdita di entropia incrociata quando sono presenti solo due classi di etichette (si presume che siano 0 e 1). Per ogni esempio, dovrebbe esserci un singolo valore a virgola mobile per previsione. Nello snippet di seguito, ciascuno dei quattro esempi ha un solo valore a virgola mobile e sia y_pred che y_true hanno la forma [batch_size]

CategoricalCrossentropy class
La forma di y_pred e y_true è [batch_size, num_classes]

E sappiamo che per mantenere la classificazione multi-classe è necessario fare tutto il num_class uscita l'uno rispetto all'altro, in modo da utilizzare softmax

Ref
Keras pagina ufficiale
Filettatura
SE simile Filettatura SE simile