首页 > 解决方案 > 如何使用 model.predict() 在 Keras 中重现 model.evaluate() 输出

问题描述

我有一个 Keras 模型,最后一行为:

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

在训练过程之后,我想在另一个代码中加载评估模型。我正在使用以下方法生成预测和基本事实:

y_predict = model.predict_generator(generator = testing_generator, steps=steps,verbose=0)
y_true = np.asarray(feature_extractor.classes, dtype='float32')
print('predicted {} samples with {} classes'.format(y_predict.shape[0],y_predict.shape[1]))            
        #Calculate score and error
acc = keras.metrics.binary_accuracy(y_true, y_predict)
err = keras.losses.categorical_crossentropy(tf.convert_to_tensor(y_true, np.float32), tf.convert_to_tensor(y_predict, np.float32))
sess = tf.InteractiveSession() 
acc_now = np.mean(acc.eval())
err_now = np.mean(err.eval())
sess.close()
print('Acc and Err from model.predict: {},{}'.format(acc_now,err_now))
print('Model.evaluate output: {}'.format(model.evaluate_generator(generator = testing_generator, steps=steps,verbose=0)))

然后我希望评估准确性、错误率和混淆矩阵。我使用predict代替的原因evaluate是为了能够生成混淆矩阵。否则,我将不得不同时使用这两种方法,这在计算上是昂贵的。

问题是,我得到了不同的值:

来自model.predict的Acc和Err:0.8237550854682922,12.75771713256836

模型.评估输出:[13.05123828162994,0.10646823157343649]

准确率从我方法中的 0.82 下降到模型评估输出中的 0.1。我是否model.predict()根据需要转换输出?如何使用结果进行模型评估model.predict()

我也关注了这个 github 问题并尝试了设置的解决方案m=Model(x,x)。和 的形状和类型y_predict相同y_true。这种方法仍然产生:

来自 m.evaluate 的分数:[12.757719990861846, 0.11333714980412431]

使用示例代码:

        x = Input(y_predict.shape[1:])
        m = Model(x, x)
        m.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')
        scores = m.evaluate(y_predict, y_true, batch_size=256, verbose=0) 
        print('Scores from m.evaluate: {}'.format(scores))

evaluate()在这里,精度很低,尽管与输出和误差仍然不同,它与predict()零件相同。


添加模型定义:

num_rows = data_in[-2]
num_columns = data_in[-1]
num_channels = data_in[-3]
num_labels = data_out[-1]


# Construct model     
model = Sequential()
for i in range(cnn_size):
    model.add(Conv2D(filters=2**(i)*16, kernel_size=kernel_size, input_shape=(num_channels, num_rows, num_columns), activation='relu'))
    model.add(MaxPooling2D(pool_size=pool_size))
    model.add(Dropout(dropout_rate))
model.add(GlobalAveragePooling2D())
model.add(Dense(num_labels, activation='softmax'))
model.compile(loss='categorical_crossentropy', metrics=['accuracy'], optimizer='adam')

地点data_in = (1, 40, 180)和地点data_out = (1, 10)

顺便说一句,我知道我可以为这些统计数据实现我自己的 numpy 解决方案,但我想使用与 Keras 相同的功能来避免实现变化。

标签: pythonkeras

解决方案


我建议看看这篇文章。它是用德语写的,但代码中的所有注释和随附的说明都是英文的,所以应该没有问题。他有一种类似的方法,有明确的指示。只需向下滚动到“Fehleranalysis”部分。

https://www.mt-ag.com/so-entwirft-man-ein-top-cnn/


推荐阅读