Keras: modèle.évaluer vs modèle.prédire l'exactitude de la différence de multi-classe PNL tâche

Je suis la formation d'un modèle simple dans keras pour la PNL tâche avec le code suivant. Les noms de variables sont explicites pour former, de test et de validation. Ce jeu de données a 19 classes finale de la couche 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 une de ces sorties.

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

Puis-je évaluer mon modèle sur le jeu de données de test et cela me montre aussi la précision autour de 0,98.

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

Toutefois, les étiquettes sont des "one-hot" codé, donc j'ai besoin de prédiction de vecteur de classes afin que je peut générer de la confusion de la matrice etc. J'utilise donc,

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 le total des prédit classes étaient de 83% précise toutefois model1.evaluate montre 98% de précision!! Ce que je fais mal? Est mon la perte de la fonction d'accord avec catégorique étiquettes de classe? C'est mon choix de sigmoid fonction d'activation pour la prédiction de la couche d'accord? ou il ya une différence dans la façon dont keras évalue un modèle? Veuillez indiquer, sur ce qui peut être mauvais. C'est mon premier essai de faire un modèle de profondeur donc je n'ai pas beaucoup de compréhension de ce qui est mauvais ici.

Utilisation 'softmax' et 'categorical_crossentropy' au lieu de 'sigmoid' et 'binary_crossentropy'. En utilisant les deux, vous êtes de traiter le problème comme un multilabel problème, pas une multiclass problème.
Je vous remercie pour votre réponse. Je vais essayer cela et mettra à jour en conséquence.

OriginalL'auteur Sal A. | 2017-08-21