Keras:model.evaluate vs model.predict 多类 NLP 任务中的准确率差异

Posted

技术标签:

【中文标题】Keras:model.evaluate vs model.predict 多类 NLP 任务中的准确率差异【英文标题】:Keras: model.evaluate vs model.predict accuracy difference in multi-class NLP task 【发布时间】:2018-01-29 16:02:05 【问题描述】:

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

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)

在第一个 epoch 之后,这给了我这些输出。

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

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

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

但是,标签是一次性编码的,所以我需要类的预测向量,以便生成混淆矩阵等。所以我使用,

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

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

【问题讨论】:

【参考方案1】:

我发现了问题。 metrics=['accuracy'] 根据成本函数自动计算准确度。所以使用binary_crossentropy 显示二进制精度,而不是分类精度。使用categorical_crossentropy 自动切换到分类精度,现在它与使用model1.predict() 手动计算相同。 Yu-Yang 指出了多类问题的代价函数和激活函数是对的。

P.S:使用metrics=['binary_accuracy', 'categorical_accuracy'] 可以同时获得分类和二进制精度

【讨论】:

很好 (+1) - 不幸的是,我不得不从头开始重新发现和理解这个问题 - 请参阅 ***.com/questions/41327601/… 和 ***.com/questions/42081257/… - 不过,我更新了我的答案以链接到你的。 ..

以上是关于Keras:model.evaluate vs model.predict 多类 NLP 任务中的准确率差异的主要内容,如果未能解决你的问题,请参考以下文章

Keras model.evaluate() 和 model.predict() 有啥区别?

Keras model.evaluate_generator结果几乎是真实准确度的两倍?

Keras:训练和验证集上的 model.evaluate() 与上次训练时期后的 acc 和 val_acc 不同

keras训练完模型,为啥对训练集进行evaluate和训练时的loss完全不一样?白训练了吗?

从 Keras model.predict_generator 计算准确率

Tensorflow model.evaluate 给出的结果与从训练中获得的结果不同