A entropia cruzada categórica funciona de maneira errada com recursos codificados de uma única vez

Aug 18 2020

Estou lutando com o problema categorical_crossentropy com dados de codificação one-hot. O problema está na saída inalterada do código apresentado a seguir:

            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

Poucas palavras sobre dados: 1190 recursos ( 10 recursos reais com 119 categorias). As entradas são linhas de dataframe com 1190 valores por amostra. A saída é um valor binário 0 ou 1.

Tentativas feitas antes: binary_crossentropy usado com resultados satisfatórios, porém, o número de amostras não é suficiente para obter bons resultados nos dados de validação. Tentei usar diferentes ativações e tamanhos de camada.

A questão principal é por que categorical_crossentropy não está funcionando e como usá-lo da maneira certa.

Além disso, surge uma preocupação sobre a representação de dados: é a maneira certa de usar em uma linha rara de dados simples codificados one-hot?

Respostas

10xAI Aug 18 2020 at 13:52

Para funcionar -

  1. Altere a contagem de neurônios de saída para 02
  2. Ativação da saída para Softmax
  3. Mantenha todos os vetores de saída OHE


É assim que Keras é projetado internamente. O mesmo foi escrito na página de documentação oficial

Classe BinaryCrossentropy
Use essa perda de entropia cruzada quando houver apenas duas classes de rótulo (assumidas como 0 e 1). Para cada exemplo, deve haver um único valor de ponto flutuante por predição. No snippet abaixo, cada um dos quatro exemplos tem apenas um único valor de apontamento flutuante, e y_pred e y_true têm a forma [batch_size]

Classe CategoricalCrossentropy
A forma de y_pred e y_true são [batch_size, num_classes]

E sabemos que para manter a multiclasse de Classificação , você precisa tornar todas as saídas num_class relativas umas às outras, então usamos softmax


Página oficial de Ref Keras
Tópico
SE semelhante Tópico SE semelhante