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.predict
des 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?
machine-learning
python
neural-network
keras
lstm
Dookoto_Sea
la source
la source
Réponses:
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.
la source
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
Assurez-vous ensuite que votre couche de sortie possède deux neurones avec une fonction d'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)
.la source
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.(−∞,∞
la source