繁体   English   中英

在keras中生成混淆矩阵以进行多类分类

[英]generating confusion matrix in keras for multiclass classification

通过训练模型获得高达 98% 的准确率,但混淆矩阵显示非常高的错误分类。

我正在使用 keras 和预训练 VGG16 模型上的迁移学习方法进行多类分类。

问题是使用 CNN 将图像分类为 5 种番茄病害。

有 5 个疾病类别,6970 个训练图像和 70 个测试图像。

训练模型显示准确率为 98.65%,而测试显示准确率为 94%。

但问题是当我生成混淆矩阵时,它显示出非常高的错误分类。

有人请帮助我,我的代码是错误的还是模型错误? 我很困惑我的模型是否给出了正确的结果。

如果有人可以向我解释 keras 实际上是如何使用 model.fit_generator 函数计算精度的,因为在混淆矩阵上应用精度的一般公式并没有给我与 keras 计算出的结果相同的结果。

用于测试数据集的代码是:

test_generator = test_datagen.flow_from_directory(
test_dir,
target_size=(150, 150),
batch_size=20,
class_mode='categorical')
test_loss, test_acc = model.evaluate_generator(test_generator, steps=50)
print('test acc:', test_acc)

我从其中一个论坛找到了生成混淆矩阵的代码;

代码是:

import numpy as np
from sklearn.metrics import confusion_matrix,classification_report
batch_size = 20
num_of_test_samples = 70
predictions = model.predict_generator(test_generator,  num_of_test_samples // batch_size+1)

y_pred = np.argmax(predictions, axis=1)

true_classes = test_generator.classes

class_labels = list(test_generator.class_indices.keys())   

print(class_labels)

print(confusion_matrix(test_generator.classes, y_pred))

report = classification_report(true_classes, y_pred, target_names=class_labels)
print(report)

以下是我得到的结果:

测试精度:

Found 70 images belonging to 5 classes.
test acc: 0.9420454461466182

混淆矩阵的结果:

['TEB', 'TH', 'TLB', 'TLM', 'TSL']
[[2 3 2 4 3]
 [4 2 3 0 5]
 [3 3 3 2 3]
 [3 3 2 4 2]
 [2 2 4 4 2]]]
              precision    recall  f1-score   support

         TEB       0.14      0.14      0.14        14
          TH       0.15      0.14      0.15        14
         TLB       0.21      0.21      0.21        14
         TLM       0.29      0.29      0.29        14
         TSL       0.13      0.14      0.14        14

   micro avg       0.19      0.19      0.19        70
   macro avg       0.19      0.19      0.19        70
weighted avg       0.19      0.19      0.19        70

在创建测试数据生成器时, flow_from_directory方法默认采用shuffle=True参数。 因此,当您通过插入生成器实例进行预测时,预测的显示顺序与真实类的显示顺序不同。 这就是您获得正确预测但顺序不同的原因。 因此,混淆矩阵表现不佳。

只需在测试数据生成器中将 shuffle 设置为 False,预测就会以正确的顺序出现。 由于验证/测试数据的目的是评估模型,您几乎总是可以将 shuffle 设置为 False。

测试标签应该是 class_indices 而不是 classes

true_classes = test_generator.class_indices

亲爱的总是对任何分类性能参数执行以下操作:

  1. 首先重置您在预测中使用的生成器
  2. 在 flow_from_directory() 中将 shuffle 设置为 false

我可能会迟到,但也许您没有像训练数据那样预处理测试数据。 尝试从 VGG16 导入预处理函数并将其作为参数(preprocessing_function)添加到生成器中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM