此原创作品在此处展示 这里
如何基于CNN模型绘制混淆矩阵?
import numpy as npfrom keras.models import Sequentialfrom keras.layers import Dense, Dropout, Activation, Flattenfrom keras.layers import Convolution2D, Conv2D, MaxPooling2D, GlobalAveragePooling2Dfrom keras.optimizers import Adamfrom keras.utils import np_utilsfrom sklearn import metrics ##Need to put this block of code in for cuDNN to initialize properlyimport tensorflow as tfconfig = tf.compat.v1.ConfigProto(gpu_options = tf.compat.v1.GPUOptions(per_process_gpu_memory_fraction=0.8)# device_count = {'GPU': 1})config.gpu_options.allow_growth = Truesession = tf.compat.v1.Session(config=config)tf.compat.v1.keras.backend.set_session(session)#------------------------------------------------------------------------------------------------------------------num_rows = 40num_columns = 174num_channels = 1x_train = x_train.reshape(x_train.shape[0], num_rows, num_columns, num_channels)x_test = x_test.reshape(x_test.shape[0], num_rows, num_columns, num_channels)num_labels = yy.shape[1]filter_size = 2# Construct model model = Sequential()model.add(Conv2D(filters=16, kernel_size=2, input_shape=(num_rows, num_columns, num_channels), activation='relu'))model.add(MaxPooling2D(pool_size=2))model.add(Dropout(0.2))model.add(Conv2D(filters=32, kernel_size=2, activation='relu'))model.add(MaxPooling2D(pool_size=2))model.add(Dropout(0.2))model.add(Conv2D(filters=64, kernel_size=2, activation='relu'))model.add(MaxPooling2D(pool_size=2))model.add(Dropout(0.2))model.add(Conv2D(filters=128, kernel_size=2, activation='relu'))model.add(MaxPooling2D(pool_size=2))model.add(Dropout(0.2))model.add(GlobalAveragePooling2D())model.add(Dense(num_labels, activation='softmax'))
然后进行训练如下:
from keras.callbacks import ModelCheckpoint from datetime import datetime #num_epochs = 12#num_batch_size = 128num_epochs = 72num_batch_size = 256checkpointer = ModelCheckpoint(filepath='saved_models/weights.best.basic_cnn.hdf5', verbose=1, save_best_only=True)model.fit(x_train, y_train, batch_size=num_batch_size, epochs=num_epochs, validation_data=(x_test, y_test), callbacks=[checkpointer], verbose=1)
我尝试了几种方法,其中一种是:
import matplotlib.pyplot as pltplt.figure(figsize=(12, 4))plot_confusion_matrix=(model(),x_test, y_test)plt.plot(plot_confusion_matrix)
但我无法绘制出混淆矩阵。
我也查看了 tf.math.confusion_matrix()
,但在上述CNN模型中,labels
和 predictions
应该如何定义?
混淆矩阵是多分类问题。
是
y_true = np.argmax(y_test, 1)
吗?
和
y_pred = model.predict_classes(x_test)
吗?
回答:
labels: 分类任务的真实标签的一维张量。predictions: 给定分类任务的预测的一维张量。
正如官方文档中所说,labels 是输出类的名称,而predictions 是预测。然而,由于它们必须是一维张量,这意味着labels 将是单个实例的真实值,而Predictions 中对应的索引值将保存其预测值。因此,您可以做的就是获取每个实例的预测和标签,在您的代码中,您传递了 x_test 和 y_test,这些不是应该传递的元素。相反,使用 model.predict 来获取输出标签。
y_predict=model.predict(x_test)y_true=y_testres = tf.math.confusion_matrix(y_true,y_predict)
现在这个 res 是一个二维矩阵,要打印它,您需要
plot_confusion_matrix(classifier, X_test, y_test, display_labels=class_names, cmap=plt.cm.Blues, normalize=normalize)
这里设置 classifier = “model”,而不是函数模型 model()。希望这对您有帮助,以下是一些额外的资源。