【问题标题】:Find confusion matrix of image classification in Tensorflow在 Tensorflow 中查找图像分类的混淆矩阵
【发布时间】:2021-12-24 06:27:01
【问题描述】:

我正在按照本教程训练模型将图像分类为 2 类:https://www.tensorflow.org/tutorials/images/classification

model.fit() 之后,我想使用包含未包含在训练或验证集中的图像的测试集来评估模型预测的准确性。测试集包含 2 个文件夹,其中包含相应类别的图像。

├── test_data/
│   ├── class1/
│   ├── class2/

我想使用混淆矩阵找到每个类的召回率、精度和准确率。 但是,我是深度学习和 Tensorflow 的新手。我不知道如何获得每个班级的混淆矩阵。我也不确定我将图像传递给模型的方式是否正确。

以下是我目前使用模型预测新数据的实现。

# get the list of class names in the training set
train_class_names = train_ds.class_names

# load the test data
test_data_dir = pathlib.Path('test_data/')
test_data_list = list(test_data_dir.glob('*/*.jpg'))

test_ds = tf.keras.utils.image_dataset_from_directory(
  test_data_dir,
  image_size=(img_height, img_width),
  batch_size=batch_size)

predicted_img = []

# for every image in the test_data folder, pass it to the model to predict its class
for path in test_data_list:
    img = tf.keras.utils.load_img(
        path, target_size=(img_height, img_width)
    )
    img_array = tf.keras.utils.img_to_array(img)
    img_array = tf.expand_dims(img_array, 0)
    
    test_class_name = path.parent.name

    predictions = model.predict(img_array)
    score = tf.nn.softmax(predictions[0])
    
    # append the image, predicted class and actual class to a list 
    # so that I can print them out to see if the prediction is correct
    predicted_img.append([img, train_class_names[np.argmax(score)], test_class_name])

【问题讨论】:

    标签: python tensorflow confusion-matrix


    【解决方案1】:

    试试这个

    from sklearn.metrics import confusion_matrix, classification_report
    import seaborn as sns
    sns.set_style('darkgrid')
    classes=test_ds.class_names # ordered list of class names
    ytrue=[]
    for images, label in test_ds:   
        for e in label:
            ytrue.append(classes[e]) # list of class names associated with each image file in test dataset 
    ypred=[]
    errors=0
    count=0
    preds=model.predict(test_ds, verbose=1) # predict on the test data
    for i, p in enumerate(preds):
        count +=1
        index=np.argmax(p) # get index of prediction with highest probability
        klass=classes
    [index] 
        ypred.append(klass)  
        if klass != ytrue[i]:
            errors +=1
    acc= (count-errors)* 100/count
    msg=f'there were {count-errors} correct predictions in {count} tests for an accuracy of {acc:6.2f} % '
    print(msg) 
    ypred=np.array(ypred)
    ytrue=np.array(ytrue)
    if len(classes)<= 30: # if more than 30 classes plot is not useful to cramed
            # create a confusion matrix 
            cm = confusion_matrix(y_true, y_pred )        
            length=len(classes)
            if length<8:
                fig_width=8
                fig_height=8
            else:
                fig_width= int(length * .5)
                fig_height= int(length * .5)
            plt.figure(figsize=(fig_width, fig_height))
            sns.heatmap(cm, annot=True, vmin=0, fmt='g', cmap='Blues', cbar=False)       
            plt.xticks(np.arange(length)+.5, classes, rotation= 90)
            plt.yticks(np.arange(length)+.5, classes, rotation=0)
            plt.xlabel("Predicted")
            plt.ylabel("Actual")
            plt.title("Confusion Matrix")
            plt.show()
    clr = classification_report(ytrue, ypred, target_names=class_names)
    print("Classification Report:\n----------------------\n", clr) 
    

    【讨论】:

      猜你喜欢
      • 2022-01-02
      • 2018-10-21
      • 2018-09-26
      • 2018-06-06
      • 2017-05-27
      • 1970-01-01
      • 2018-12-19
      • 2020-08-10
      • 2018-11-22
      相关资源
      最近更新 更多