【问题标题】:How to get confusion matrix from the below model?如何从以下模型中获取混淆矩阵?
【发布时间】:2020-10-03 07:59:04
【问题描述】:

X 代表特征,Y 代表图像分类的标签。我正在使用 CNN 进行二值图像分类,例如猫和狗。

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Activation, Flatten, Conv2D, MaxPooling2D
import pickle
import numpy as np
from sklearn.metrics import confusion_matrix


X = np.array(pickle.load(open("X.pickle","rb")))
Y = np.array(pickle.load(open("Y.pickle","rb")))

x_test = np.array(pickle.load(open("x_test.pickle","rb")))
y_test = np.array(pickle.load(open("y_test.pickle","rb")))


# X = np.array(pickle.load(open("x_train.pickle","rb")))
# Y = np.array(pickle.load(open("y_train.pickle","rb")))

#scaling our image data
X = X/255.0

model = Sequential()
#model.add(Conv2D(64 ,(3,3), input_shape = X.shape[1:]))
model.add(Conv2D(64 ,(3,3), input_shape = X.shape[1:]))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))

model.add(Conv2D(128 ,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))

model.add(Conv2D(256 ,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))

model.add(Conv2D(512 ,(3,3)))
model.add(Activation("relu"))
model.add(MaxPooling2D(pool_size = (2,2)))

model.add(Flatten())

model.add(Dense(2048))
model.add(Activation("relu"))

model.add(Dropout(0.5))

np.argmax(model.add(Dense(2)))
model.add(Activation('softmax'))

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

predicted = model.predict(x_test)
print(predicted.shape)
print(y_test.shape)
print(confusion_matrix(y_test,predicted))

预测和 y_test 形状的输出是 (90, 2) 和 (90,) 当我使用混淆矩阵时,它会刷新:- ValueError:分类指标无法处理二进制和连续多输出目标的混合。

【问题讨论】:

    标签: python confusion-matrix conv-neural-network


    【解决方案1】:

    你可以使用 scikit-learn:

    from sklearn.metrics import confusion_matrix
    
    predicted = model.predict(x_test)
    print(confusion_matrix(y_test,predicted.round()))
    

    这里是混淆矩阵的 scikit learn 文档:

    https://scikit-learn.org/stable/modules/generated/sklearn.metrics.confusion_matrix.html

    编辑:

    建议:

    • 更喜欢在输出层使用 Softmax 激活,无论是二分类还是多标签分类。使用 softmax,输出层中的节点数 = 类数。

    【讨论】:

    • 感谢您的回复,我使用了您所说的,但仍然显示错误!我做错什么了吗。我在我的代码中保存了编辑。
    • 您的预测形状和测试形状不同。因为您正在从 x_test pickle 加载 y_test。行:y_test = np.array(pickle.load(open("x_test.pickle","rb")))。我猜泡菜文件应该是“y_test.pickle”。你写错了。请检查
    • 我已经根据你所说的进行了更改,但我仍然得到与 x_shape 和 y_shape be (90, 1) (90,) 相同的错误。
    • 好的,我知道了,为什么您会收到此错误。这是因为您在输出层而不是 softmax 层上应用了 sigmoid 函数。因此,预测值中的值是小数,其中 y_test 中的值是 1 或 0。因此,您可以使用 round() 函数对预测值进行四舍五入。检查我的答案,我已经编辑了我的答案。
    • 你用过。 Dense(1),应该是 Dense(2)。因此,作为输出,您将获得 2 个值,然后您必须将具有最大值的索引作为输出。 (您可以为此目的使用 argmax())。
    【解决方案2】:

    以下是我们如何使用 PyCM 库获取混淆矩阵的一个示例: 您需要在 anaconda 中或使用 pip3 安装 pycm 库

    conda install -c sepandhaghighi pycm
    
    from pycm import *
    
    def plot_confusion_matrix(cm, normalize=False, title='Confusion matrix', cmap=plt.cm.Blues):
        """
        This function modified to plots the ConfusionMatrix object.
        Normalization can be applied by setting 'normalize=True'.
        Code Reference : 
        http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html
        """
        plt_cm = []
        for i in cm.classes :
            row=[]
            for j in cm.classes:
                row.append(cm.table[i][j])
            plt_cm.append(row)
        plt_cm = np.array(plt_cm)
        if normalize:
            plt_cm = plt_cm.astype('float') / plt_cm.sum(axis=1)[:, np.newaxis]     
        plt.imshow(plt_cm, interpolation='nearest', cmap=cmap)
        plt.title(title)
        plt.colorbar()
        tick_marks = np.arange(len(cm.classes))
        plt.xticks(tick_marks, cm.classes, rotation=45)
        plt.yticks(tick_marks, cm.classes)
    
        fmt = '.2f' if normalize else 'd'
        thresh = plt_cm.max() / 2.
        for i, j in itertools.product(range(plt_cm.shape[0]), range(plt_cm.shape[1])):
            plt.text(j, i, format(plt_cm[i, j], fmt),
                    horizontalalignment="center",
                    color="white" if plt_cm[i, j] > thresh else "black")
    
        plt.tight_layout()
        plt.ylabel('Actual')
        plt.xlabel('Prediction')
    

    .....

    svm.fit(x_train, y_train)
    y_predicted = svm.predict(x_test)
    
    #Get the confusion Matrix:
    cm = ConfusionMatrix(actual_vector=y_test, predict_vector=y_predicted)
    
    #Print classes
    print("[INFO] Clases")
    print(cm.classes)
    #Print the table of cmatrix
    print(cm.table)
    #indicators of the confusion matrix
    print(cm)
    

    你好!

    【讨论】:

      猜你喜欢
      • 2019-10-20
      • 2018-11-27
      • 2020-09-20
      • 2019-12-28
      • 2021-07-28
      • 2016-05-07
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      相关资源
      最近更新 更多