Keras:model.evaluate vs model.predict多级NLP任务的准确度差异

Sal*_* A. 15 machine-learning deep-learning keras

我正在使用以下代码在keras中训练一个简单的模型用于NLP任务.变量名称对于训练,测试和验证集是不言自明的.该数据集有19个类,因此网络的最后一层有19个输出.标签也是单热编码的.

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)
Run Code Online (Sandbox Code Playgroud)

在第一个时代之后,这给了我这些输出.

Epoch 1/200
216632/216632 [==============================] - 2442s - loss: 0.1427 - acc: 0.9443 - val_loss: 0.0526 - val_acc: 0.9826
Run Code Online (Sandbox Code Playgroud)

然后我在测试数据集上评估我的模型,这也显示我在0.98附近的准确度.

model1.evaluate(test_data, y = ytestenc, batch_size=384, verbose=1)
Run Code Online (Sandbox Code Playgroud)

但是,标签是单热编码的,所以我需要类的预测向量,以便我可以生成混淆矩阵等.所以我使用,

PREDICTED_CLASSES = model1.predict_classes(test_data, batch_size=384, verbose=1)
temp = sum(test_labels == PREDICTED_CLASSES)
temp/len(test_labels)
0.83
Run Code Online (Sandbox Code Playgroud)

这表明总预测类别的准确model1.evaluate度为83%,但显示准确度为98%!我在这做错了什么?我的损失功能是否可以使用分类标签?我sigmoid对预测层的激活功能的选择还可以吗?或者keras评估模型的方式有所不同?请提出可能出错的建议.这是我第一次尝试制作一个深层模型,所以我对这里的错误并不太了解.

Sal*_* A. 32

我发现了这个问题.metrics=['accuracy']从成本函数自动计算精度.因此使用binary_crossentropy显示二进制精度,而不是分类准确性.使用categorical_crossentropy自动切换到分类精度,现在与使用手动计算相同model1.predict().Yu-Yang指出了多类问题的成本函数和激活函数是正确的.

PS:通过使用可以获得分类和二进制精度 metrics=['binary_accuracy', 'categorical_accuracy']

  • 很棒的捕获(+1) - 不幸的是,我不得不重新发现并从头开始理解这个问题 - 请参阅/sf/ask/2892932101/ -crossentropy-for-multi/46004661#46004661和/sf/ask/2945688021/#46038271 - 尽管如此,我更新了我的链接到你的... (2认同)