python - 使用分类报告评估 Keras 模型
问题描述
问题:
在训练期间,我的模型的性能看起来还不错。然而,来自 sklearn 的分类报告的结果几乎在所有地方都产生了精度、召回率和 f1 为零的结果。在训练性能和推理之间出现如此不匹配的问题,我做错了什么?(我正在使用带有 TensorFlow 后端的 Keras。)
我的代码:
我使用该valiation_split
参数生成两个生成器(训练、验证),如下所示:
train_datagen = ImageDataGenerator(
rescale=1. / 255, validation_split=0.15)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='categorical', subset="training")
validation_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(img_height, img_width),
batch_size=batch_size,
class_mode='categorical', subset="validation", shuffle=False)
我shuffle=False
在我的 validation_generator 中设置以确保它不会混合图像和标签的关系以供我稍后评估。
接下来,我像这样训练我的模型:
history = model.fit_generator(
train_generator,
steps_per_epoch=nb_train_samples // batch_size,
epochs=epochs,
validation_data=validation_generator,
validation_steps=nb_validation_samples // batch_size,
verbose=1)
性能没问题:
Epoch 1/5
187/187 [==============================] - 44s 233ms/step - loss: 0.7835 - acc: 0.6744 - val_loss: 1.2918 - val_acc: 0.6079
Epoch 2/5
187/187 [==============================] - 42s 225ms/step - loss: 0.7578 - acc: 0.6901 - val_loss: 1.2962 - val_acc: 0.6149
Epoch 3/5
187/187 [==============================] - 40s 216ms/step - loss: 0.7535 - acc: 0.6907 - val_loss: 1.3426 - val_acc: 0.6061
Epoch 4/5
187/187 [==============================] - 41s 217ms/step - loss: 0.7388 - acc: 0.6977 - val_loss: 1.2866 - val_acc: 0.6149
Epoch 5/5
187/187 [==============================] - 41s 217ms/step - loss: 0.7282 - acc: 0.6960 - val_loss: 1.2988 - val_acc: 0.6297
现在,我按照https://github.com/keras-team/keras/issues/2607#issuecomment-302365916建议的方法提取分类报告的必要信息。这给了我以下信息:
validation_steps_per_epoch = np.math.ceil(validation_generator.samples / validation_generator.batch_size)
predictions = model.predict_generator(validation_generator, steps=validation_steps_per_epoch)
# Get most likely class
predicted_classes = np.argmax(predictions, axis=1)
true_classes = validation_generator.classes
class_labels = list(validation_generator.class_indices.keys())
最后,我使用以下命令输出分类报告:
from sklearn.metrics import classification_report
report = classification_report(true_classes, predicted_classes, target_names=class_labels)
print(report)
这导致到处都是零(见下面的平均值):
precision recall f1-score support
micro avg 0.01 0.01 0.01 2100
macro avg 0.01 0.01 0.01 2100
weighted avg 0.01 0.01 0.01 2100
解决方案
推荐阅读
- powershell - 在从 Invoke-Command 执行的脚本中访问凭证
- javascript - 如何在 14 秒内向下滚动 jQuery 中的页面
- android - 如何使用参数在 volley android 中创建发布请求
- json - Grails:如何在将域类转换为 JSON 时排除 ApplicationHttpRequest 字段
- python - 如何避免本节中的重复代码?
- javascript - 在 ReactJs 中删除 Json 的一些对象
- search - 如果我在双向链表中同时使用头指针和尾指针来搜索元素,我的时间复杂度会更小吗?
- xml - 如何使用 xmlstarlet 合并两个 xml 文件
- http - HTTP 请求解析
- python - 如何在使用opencv和python检测后只保存眼睛图像?