我的模型是这样的
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.evaluate
和 model.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 数据的示例,请参见我的回答。