Que signifie la sortie de la fonction model.predict de Keras?


14

J'ai construit un modèle LSTM pour prédire les questions en double sur le jeu de données officiel Quora. Les étiquettes de test sont 0 ou 1. 1 indique que la paire de questions est en double. Après avoir construit le modèle à l'aide model.fit, je teste le modèle à l'aide model.predictdes données de test. La sortie est un tableau de valeurs quelque chose comme ci-dessous:

 [ 0.00514298]
 [ 0.15161049]
 [ 0.27588326]
 [ 0.00236167]
 [ 1.80067325]
 [ 0.01048524]
 [ 1.43425131]
 [ 1.99202418]
 [ 0.54853892]
 [ 0.02514757]

Je ne montre que les 10 premières valeurs du tableau. Je ne comprends pas ce que signifient ces valeurs et quelle est l'étiquette prévue pour chaque paire de questions?


1
Je pense que vous avez un problème dans votre réseau .. les probabilités devraient être à l'échelle 0-1 .. mais vous en avez 1.99!, Je pense que vous avez quelque chose de mal ..
Ghanem

Réponses:


8

La sortie d'un réseau neuronal ne sera jamais, par défaut, binaire - c'est-à-dire des zéros ou des uns. Le réseau travaille avec des valeurs continues (non discrètes) afin d'optimiser plus librement la perte dans le cadre de la descente de gradient.

Jetez un œil ici à une question similaire qui montre également du code.

Sans aucun type de réglage et de mise à l'échelle, la sortie de votre réseau est susceptible de se situer quelque part dans la plage de votre entrée, en termes de valeur nominale. Dans votre cas, cela semble être à peu près entre 0 et 2.

Vous pouvez maintenant écrire une fonction qui transforme vos valeurs ci-dessus en 0 ou 1, en fonction d'un certain seuil. Par exemple, mettez les valeurs à l'échelle dans la plage [0, 1], puis si la valeur est inférieure à 0,5, retournez 0, si supérieure à 0,5, retournez 1.


Merci, moi aussi, j'ai pensé à utiliser une valeur seuil pour classer les étiquettes. Mais quelle devrait être la base sur laquelle la valeur seuil a été décidée?
Dookoto_Sea

@Dookoto_Sea vous devez le décider vous
Jérémy Blain

@Dookoto_Sea Veuillez noter que si votre étiquette est 0 ou 1, votre valeur doit être dans cette plage, ayant une échelle de valeurs de prédictions de [0, 2] est intrigante, vous devez changer la sortie de votre modèle
Jérémy Blain

6

Si c'est un problème de classification, vous devez changer votre réseau pour avoir 2 neurones de sortie.

Vous pouvez convertir des étiquettes en vecteurs codés à chaud à l'aide de

y_train_binary = keras.utils.to_categorical(y_train, num_classes)
y_test_binary = keras.utils.to_categorical(y_test, num_classes)

Assurez-vous ensuite que votre couche de sortie possède deux neurones avec une fonction d'activation softmax.

model.add(Dense(num_classes, activation='softmax'))

Cela se traduira par votre model.predict(x_test_reshaped)être un tableau de listes. Où la liste interne est la probabilité qu'une instance appartienne à chaque classe. Cela ajoutera jusqu'à 1 et, de toute évidence, l'étiquette décidée devrait être le neurone de sortie avec la plus forte probabilité.

Keras l'a inclus dans sa bibliothèque, vous n'avez donc pas besoin de faire cette comparaison vous-même. Vous pouvez obtenir le libellé de classe directement en utilisant model.predict_classes(x_test_reshaped).


3
"Si c'est un problème de classification, vous devez changer votre réseau pour avoir 2 neurones de sortie." .. désolé Jah, mais il ne devrait pas, il peut le faire avec un neurone et sigmoïde au lieu de la fonction softmax.
Ghanem

@Minion, les deux méthodes sont essentiellement équivalentes, le seuillage que vous auriez autrement dû faire avec un seul neurone de sortie est implicitement intégré au réseau. Fournissant ainsi la sortie binaire.
JahKnows

1
Oui je kow .. J'ai commenté juste parce qu'il a mentionné: "devrait changer votre réseau pour avoir 2 neurones de sortie." .. merci
Ghanem

1

Les prédictions sont basées sur ce que vous alimentez en tant que sorties de formation et la fonction d'activation.

Par exemple, avec une entrée 0-1 et une fonction d'activation sigmoïde pour la sortie avec une perte bentrentropique binaire, vous obtiendrez la probabilité d'un 1. En fonction du coût d'une mauvaise décision dans les deux sens, vous pouvez alors décider de la façon dont vous gérer ces probabilités (par exemple, prédire la catégorie "1", si la probabilité est> 0,5 ou peut-être déjà lorsqu'elle est> 0,1).

D'après ce que vous décrivez, vous aviez une entrée 0-1 et supposiez vraisemblablement une activation linéaire pour votre couche de sortie (peut-être avec une perte d'erreur quadratique moyenne?). Cela signifie que vous avez supposé un problème de régression, où la sortie est directement un nombre prédit (qui peut être n'importe quel nombre réel provenant de ). Je suppose que ce n'est pas ce que vous vouliez et que vous voudrez peut-être ce que Je l'ai mentionné dans le premier paragraphe à la place.(,

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.