从 Keras model.evaluate 和 model.predict 得到不同的结果

Min*_*lek 8 python machine-learning predict deep-learning keras

我已经训练了模型中使用word2vec和使用keras的LSTM模型来预测主题类别,并有大约训练期间98%的准确率,我保存的模型,然后装到另一个文件试图在测试集,我用model.evaluatemodel.predict,结果非常不一样。

我使用 keras 和 tensorflow 作为后端,模型摘要是:

_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm_1 (LSTM)                (None, 22)                19624     
_________________________________________________________________
dropout_1 (Dropout)          (None, 22)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 40)                920       
_________________________________________________________________
activation_1 (Activation)    (None, 40)                0         
=================================================================
Total params: 20,544
Trainable params: 20,544
Non-trainable params: 0
_________________________________________________________________
None
Run Code Online (Sandbox Code Playgroud)

编码:

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.load_weights(os.path.join('model', 'lstm_model_weights.hdf5'))
score, acc = model.evaluate(x_test, y_test, batch_size=batch_size)

print()
print('Score: %1.4f' % score)
print('Evaluation Accuracy: %1.2f%%' % (acc*100))

predicted = model.predict(x_test, batch_size=batch_size)
acc2 = np.count_nonzero(predicted.argmax(1) == y_test.argmax(1))/y_test.shape[0]
print('Prediction Accuracy: %1.2f%%' % (acc2*100))
Run Code Online (Sandbox Code Playgroud)

这段代码的输出是

39680/40171 [============================>.] - ETA: 0s  
Score: 0.1192
Evaluation Accuracy: 97.50%
Prediction Accuracy: 9.03%
Run Code Online (Sandbox Code Playgroud)

谁能告诉我我错过了什么?

小智 0

评估和预测是两种不同的方法,您可以查看 Keras 文档。

model.evaluate目的是评估模型在给定数据集上的性能,并将返回给model.compile定数据集的模型损失和指定指标。它通常在测试数据集中很有用。想象model.evaluate一下,model.fit但是参数是静态的(不可训练):它将把给定的数据集作为输入,将其通过模型(1 epoch)并计算并返回损失和指标。

model.predict另一方面是类似的。尽管如此,它不会返回损失和指标,而是返回一个数组,其中包含给定数据集上每个示例的预测类别。

因此,在您的示例中,您不应将其解释predicted为分数,而应将其解释为模型的一类。

查看Keras 文档以获取更深入的详细信息。