Keras: model.évaluer le modèle vs.prédiction de la différence de précision dans les tâches de PNL à classes multiples

je forme un modèle simple dans keras pour la tâche NLP avec le code suivant. Les noms des variables sont explicatifs pour le train, le test et le jeu de validation. Cet ensemble de données comporte 19 classes de sorte que la couche finale du réseau a 19 sorties. Les étiquettes sont également chaud codé.

nb_classes = 19
model1 = Sequential()
model1.add(Embedding(nb_words,
                     EMBEDDING_DIM,
                     weights=[embedding_matrix],
                     input_length=MAX_SEQUENCE_LENGTH,
                     trainable=False))
model1.add(LSTM(num_lstm, dropout=rate_drop_lstm, recurrent_dropout=rate_drop_lstm))
model1.add(Dropout(rate_drop_dense))
model1.add(BatchNormalization())
model1.add(Dense(num_dense, activation=act))
model1.add(Dropout(rate_drop_dense))
model1.add(BatchNormalization())

model1.add(Dense(nb_classes, activation = 'sigmoid'))


model1.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
#One hot encode all labels
ytrain_enc = np_utils.to_categorical(train_labels)
yval_enc = np_utils.to_categorical(val_labels)
ytestenc = np_utils.to_categorical(test_labels)

model1.fit(train_data, ytrain_enc,
             validation_data=(val_data, yval_enc),
             epochs=200,
             batch_size=384,
             shuffle=True,
             verbose=1)

après la première époque, cela me donne ces sorties.

Epoch 1/200
216632/216632 [==============================] - 2442s - loss: 0.1427 - acc: 0.9443 - val_loss: 0.0526 - val_acc: 0.9826

ensuite, j'évalue mon modèle sur un ensemble de données de test et cela me montre également une précision d'environ 0,98.

model1.evaluate(test_data, y = ytestenc, batch_size=384, verbose=1)

cependant, les étiquettes sont codées une fois, donc j'ai besoin de prédiction du vecteur des classes pour que je puisse générer la matrice de confusion etc. Donc j'utilise,

PREDICTED_CLASSES = model1.predict_classes(test_data, batch_size=384, verbose=1)
temp = sum(test_labels == PREDICTED_CLASSES)
temp/len(test_labels)
0.83

cela montre que les classes prédites totales étaient exactes à 83% mais model1.evaluate montre une précision de 98%!! Ce que je fais mal? Est-ce que ma fonction de perte est d'accord avec les étiquettes de classe catégorique? Est-ce que mon choix de la fonction d'activation sigmoid pour la couche prédictive est acceptable? ou il est différence dans la façon dont keras évalue un modèle? Veuillez indiquer, sur ce qui peut être mauvais. C'est la première fois que j'essaie de faire un modèle profond pour ne pas comprendre ce qui ne va pas ici.

10
demandé sur desertnaut 2017-08-21 17:20:51

1 réponses

j'ai trouvé le problème. metrics=['accuracy'] calcule la précision automatiquement à partir de la fonction de coût. Ainsi, l'utilisation de binary_crossentropy montre une précision binaire,pas catégorique. En utilisant categorical_crossentropy passe automatiquement à la précision catégorique et maintenant il est le même que calculé manuellement en utilisant model1.predict() . Yu-Yang a eu raison de souligner la fonction de coût et la fonction d'activation pour le problème multi-classe.

P. S: on peut obtenir une précision à la fois catégorique et binaire en en utilisant metrics=['binary_accuracy', 'categorical_accuracy']

17
répondu Sal A. 2017-08-23 08:45:48