Keras – model.predict_classes 提供错误的标签

我的模型是这样的

print('Build main model...')model = Sequential()model.add(Merge([left, right], mode='sum'))model.add(Dense(14, activation='softmax'))model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])            

当我使用 model.evaluate([xtest1, xtest2], y_test) 时,我得到了90%的准确率,但是当我使用 model.predict_classes([x_test1, x_xtest2]) 时,我得到了完全错误的类别标签,导致我的准确率显著下降。 model.evaluatemodel.predict_classes 之间的区别是什么?我在哪里犯了错误?


回答:

由于你在模型编译中请求了 loss='binary_cross_entropy'metric=['accuracy'],Keras 推断你对二元准确率感兴趣,这是 model.evaluate() 返回的值;实际上,由于你有14个类别,你实际上对分类准确率感兴趣,这是通过 model.predict_classes() 报告的。

因此,你应该将模型编译中的损失函数更改为 categorical_crossentropy

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy']) 

如果出于某些原因,你想继续使用 loss='binary_crossentropy'(诚然这将是一个非常不寻常的选择),你应该更改模型编译以明确你想要分类准确率,如下所示:

from keras.metrics import categorical_accuracymodel.compile(loss='binary_crossentropy', optimizer='adam', metrics=[categorical_accuracy])

在这些情况下,你会发现 model.evaluate()model.predict_classes() 报告的准确率是相同的,正如它们应该的那样。

有关更详细的解释和使用 MNIST 数据的示例,请参见我的回答

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注