2017-08-21 4 views
0

J'entraîne un classificateur binaire en utilisant la fonction d'activation sigmoïde avec une entrentropie binaire qui donne une bonne précision autour de 98%. La même chose quand je m'entraîne en utilisant softmax avec categorical_crossentropy donne une très faible précision (< 40%).
Je passe les cibles pour binary_crossentropy comme liste de 0 et 1 par exemple; [0,1,1,1,0].Classification binaire avec Softmax

Une idée de pourquoi cela se passe-t-il?

C'est le modèle que je me sers pour le second classificateur: enter image description here

+1

Pourriez-vous s'il vous plaît nous montrer le code utilisé? Peut-être que la réponse se trouve quelque part caché dans votre description. Je suppose qu'il y a officiellement plus de 2 classes dans votre second classificateur, car 40% de précision est encore pire qu'un classificateur binaire aléatoire. –

+1

Une fois que vous avez trouvé une solution qui vous convient, cliquez sur la coche à côté de cette réponse pour l'accepter. Cela permet aux autres personnes avec votre problème de savoir quelle solution fonctionne pour vous. –

Répondre

3

En ce moment, votre deuxième modèle répond toujours « classe 0 » car il peut choisir entre une seule classe (nombre de sorties de votre dernière couche).

Comme vous avez deux classes, vous devez calculer le softmax + categorical_crossentropy sur deux sorties pour choisir le plus probable.

Par conséquent, votre dernière couche doit être:

model.add(Dense(2, activation='softmax') 
model.compile(...) 

Votre modèle sigmoïde + binary_crossentropy, qui calcule la probabilité de « classe 0 » être vrai en analysant un seul numéro de sortie, est déjà correct.

EDIT: Voici une petite explication sur la fonction Sigmoid

sigmoïde peut être considéré comme une correspondance entre l'espace réel de chiffres et un espace de probabilité.

Sigmoid Function

Notez que:

Sigmoid(-infinity) = 0 
Sigmoid(0) = 0.5 
Sigmoid(+infinity) = 1 

Donc, si le nombre réel, la production de votre réseau, est très faible, le sigmoïde décidera de la probabilité de « Classe 0 » est proche de 0, et décider « classe 1 »
au contraire, si la sortie de votre réseau est très élevé, le sigmoïde décidera la probabilité de « classe 0 » est proche de 1, et de décider « classe 0 »

Sa décision je s similaire à la décision de la classe uniquement en regardant le signe de votre sortie. Cependant, cela ne permettrait pas à votre modèle d'apprendre! En effet, le gradient de cette perte binaire est nul presque partout, rendant impossible pour votre modèle d'apprendre de l'erreur, car il n'est pas quantifié correctement. C'est pourquoi sigmoid et "binary_crossentropy" sont utilisés:
Ils sont un substitut à la perte binaire, qui a de bonnes propriétés lisses, et permet l'apprentissage.

En outre, s'il vous plaît trouver plus d'informations sur Softmax Function et Cross Entropy

+0

Je comprends maintenant la logique. Mais comment sigmoïde a-t-il fonctionné avec une seule sortie? –

+1

@AKSHAYAAVAIDYANATHAN Je viens d'éditer mon post, j'espère que ça aide! –

+1

Et j'ai également réalisé la sortie devrait être dans le format-> [[0,1], [1,0]] pour la crossentropy catégorique plutôt que la liste de 1s et 0s –