L'entropia incrociata categoriale funziona in modo sbagliato con le caratteristiche codificate a caldo
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
Perché funzioni -
- Cambia il conteggio dei neuroni di output a 02
- Attivazione dell'uscita a Softmax
- 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