CNN keras 中图像的混淆矩阵

问题描述 投票:0回答:4
我已经使用 keras 训练了 CNN 模型(多类分类),现在我想在我的测试图像集上评估该模型。

除了准确度、精确度和召回率之外,还有哪些可能的选项来评估我的模型?我知道如何从自定义脚本中获得精确度和召回率。但我找不到一种方法来获取我的 12 类

images 的混淆矩阵。 Scikit-learn 显示了一种“方式”,但不适用于图像。 我正在使用 model.fit_generator () 有没有办法为我的所有类别创建混淆矩阵或找到我的类别的分类置信度?我正在使用 Google Colab,不过我可以下载模型并在本地运行。

如有任何帮助,我们将不胜感激。

代码:

train_data_path = 'dataset_cfps/train' validation_data_path = 'dataset_cfps/validation' #Parametres img_width, img_height = 224, 224 vggface = VGGFace(model='resnet50', include_top=False, input_shape=(img_width, img_height, 3)) #vgg_model = VGGFace(include_top=False, input_shape=(224, 224, 3)) last_layer = vggface.get_layer('avg_pool').output x = Flatten(name='flatten')(last_layer) xx = Dense(256, activation = 'sigmoid')(x) x1 = BatchNormalization()(xx) x2 = Dropout(0.3)(x1) y = Dense(256, activation = 'sigmoid')(x2) yy = BatchNormalization()(y) y1 = Dropout(0.6)(yy) x3 = Dense(12, activation='sigmoid', name='classifier')(y1) custom_vgg_model = Model(vggface.input, x3) # Create the model model = models.Sequential() # Add the convolutional base model model.add(custom_vgg_model) model.summary() #model = load_model('facenet_resnet_lr3_SGD_sameas1.h5') def recall(y_true, y_pred): true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) possible_positives = K.sum(K.round(K.clip(y_true, 0, 1))) recall = true_positives / (possible_positives + K.epsilon()) return recall def precision(y_true, y_pred): true_positives = K.sum(K.round(K.clip(y_true * y_pred, 0, 1))) predicted_positives = K.sum(K.round(K.clip(y_pred, 0, 1))) precision = true_positives / (predicted_positives + K.epsilon()) return precision train_datagen = ImageDataGenerator( rescale=1./255, rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, horizontal_flip=True, fill_mode='nearest') validation_datagen = ImageDataGenerator(rescale=1./255) # Change the batchsize according to your system RAM train_batchsize = 32 val_batchsize = 32 train_generator = train_datagen.flow_from_directory( train_data_path, target_size=(img_width, img_height), batch_size=train_batchsize, class_mode='categorical') validation_generator = validation_datagen.flow_from_directory( validation_data_path, target_size=(img_width, img_height), batch_size=val_batchsize, class_mode='categorical', shuffle=True) # Compile the model model.compile(loss='categorical_crossentropy', optimizer=optimizers.SGD(lr=1e-3), metrics=['acc', recall, precision]) # Train the model history = model.fit_generator( train_generator, steps_per_epoch=train_generator.samples/train_generator.batch_size , epochs=100, validation_data=validation_generator, validation_steps=validation_generator.samples/validation_generator.batch_size, verbose=1) # Save the model model.save('facenet_resnet_lr3_SGD_new_FC.h5')

以下是如何获取所有类别的混淆矩阵(或者可能使用 scikit-learn 进行统计):
python scikit-learn keras conv-neural-network
4个回答
28
投票
1.预测课程

test_generator = ImageDataGenerator() test_data_generator = test_generator.flow_from_directory( test_data_path, # Put your path here target_size=(img_width, img_height), batch_size=32, shuffle=False) test_steps_per_epoch = numpy.math.ceil(test_data_generator.samples / test_data_generator.batch_size) predictions = model.predict_generator(test_data_generator, steps=test_steps_per_epoch) # Get most likely class predicted_classes = numpy.argmax(predictions, axis=1)

2.获取真实类别和类别标签

true_classes = test_data_generator.classes class_labels = list(test_data_generator.class_indices.keys())

3.使用 scikit-learn 获取统计数据

report = metrics.classification_report(true_classes, predicted_classes, target_names=class_labels) print(report)

您可以阅读更多
这里

编辑: 如果上述方法不起作用,请观看此视频为 Keras 模型的预测创建混淆矩阵

。如果您有问题,可能会查看评论。 或者

使用 Keras CNN 图像分类器进行预测

为什么 scikit-learn 函数不能完成这项工作?您向前传递训练/测试集中的所有样本(图像),将 one-hot-encoding 转换为标签编码(请参阅

9
投票
)并将其作为

sklearn.metrics.confusion_matrix 传递到 y_pred

。您可以以类似的方式使用 
y_true
(单热标签)。
示例代码:

import sklearn.metrics as metrics y_pred_ohe = KerasClassifier.predict(X) # shape=(n_samples, 12) y_pred_labels = np.argmax(y_pred_ohe, axis=1) # only necessary if output has one-hot-encoding, shape=(n_samples) confusion_matrix = metrics.confusion_matrix(y_true=y_true_labels, y_pred=y_pred_labels) # shape=(12, 12)

这里猫和狗是类别标签:

2
投票
#Confusion Matrix and Classification Report from sklearn.metrics import classification_report from sklearn.metrics import confusion_matrix Y_pred = model.predict_generator(validation_generator, nb_validation_samples // batch_size+1) y_pred = np.argmax(Y_pred, axis=1) print('Confusion Matrix') print(confusion_matrix(validation_generator.classes, y_pred)) print('Classification Report') target_names = ['Cats', 'Dogs'] print(classification_report(validation_generator.classes, y_pred, target_names=target_names))

如果我使用 image_dataset_from_directory 怎么办?

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.