在 keras 中使用 CNN 对图像进行二值分类时正确预测的总数

Posted

技术标签:

【中文标题】在 keras 中使用 CNN 对图像进行二值分类时正确预测的总数【英文标题】:Total of correctly predicted in binary classification of images with CNN in keras 【发布时间】:2018-02-15 01:42:09 【问题描述】:

我已经成功地使用 Keras 为 CNN 中的图像构建了二进制分类模型,并使用 model.predict_classes() 进行了预测,这是我的代码:

import numpy as np
import os,sys
from keras.models import load_model
import PIL
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

%matplotlib inline


model = load_model('./potholes16_2.h5')

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

path= os.path.abspath("./potholes14/test/positive")



extensions = 'JPG'

if __name__ == "__main__":
    for f in os.listdir(path):
        if os.path.isfile(os.path.join(path,f)):
            f_text, f_ext= os.path.splitext(f)
            f_ext= f_ext[1:].upper()
            if f_ext in extensions:
                print (f)`enter code here`
                img = Image.open(os.path.join(path,f))
                
                new_width  = 200
                new_height = 200
                img = img.resize((new_width, new_height), Image.ANTIALIAS)
                
                #width, height= image.size
                                
                img = np.reshape(img,[1,new_width,new_height,3])
                classes = model.predict_classes(img)
                print (classes)

现在我想计算正确预测的图像总数,例如有多少类属于 0 类或 1 类?

【问题讨论】:

对您的测试数据批量运行推理。对于每个批次,将输出插入到数组/列表中。计算最终数组的混淆矩阵 感谢您的回答,非常感谢,我会尝试的。 所有答案都不足以接受和/或投票? 【参考方案1】:

需要调用model.evaluate函数;假设您想使用y_test 中的真实标签评估x_test 中的数据,那么:

score = model.evaluate(x_test, y_test, verbose=0) 

score[0] 会给你损失(在你的情况下是二进制交叉熵),而score[1] 包含所需的二进制精度。

查看docs了解更多详情(向下滚动查找evaluate)。

【讨论】:

感谢您的快速回复,我已经阅读了文档,但我仍然有点困惑。对不起,我是 Keras 框架的新手,我的意思是我只想计算正确预测的图像总数,它们属于 0 类或 1 类。但无论如何我会尝试一下。 您的目标数据(即标签)是一次性编码的,还是简单的数字 (0/1)? 我的目标数据只是简单的数字(0 和 1)。另外,我要预测的图像是没有任何真实标签的真实图像。 我关注this reference【参考方案2】:

您的预测数据的样本数组必须正确吗?好吧,您也可以加载该数据。保留您拥有的代码,

classes = model.predict_classes(img)

产量

array([[ 0.94981687],[ 0.57888238],[ 0.58651019],[ 0.30058956],[ 0.21879381]])

你的班级数据看起来像这样

 class_validation = np.array([[1],[0],[0],[0],[1]])

然后在四舍五入后找到相等的位置classes

np.where(np.round(classes,0)==class_validation)[0].shape[0]

注意:有很多是写最后一行,假设你的numpy数组是形状(number_of_sample,1)


另一种检查方式

totalCorrect = class_validation[((np.round(classes,0) - class_validation)==0)]
print('Correct in Class 1 = ',np.count_nonzero(totalCorrect),'Correct in Class 0 = ',abs(len(totalCorrect)-np.count_nonzero(totalCorrect)))

【讨论】:

感谢您回答我的问题。在我完全按照你上面提到的内容之后,它给了我属于 0 类的图像总数只有 2 个。而当我手动计算它时,有 6 个图像。顺便说一句,我关注this reference 来构建我的模型。 再次感谢您的回复。顺便说一下,这里是我的预测代码的结果。 4.jpeg 1/1 [===============================] - 0s [[0]] 1.jpeg 1/ 1 [==============================] - 0s [[1]] 2.jpeg 1/1 [=== ===========================] - 0s [[1]] 3.jpeg 1/1 [======== ======================] - 0s [[1]] 计数结果在 1 类中正确 = 2 在 0 类中正确 = 0 基于那里的预测结果有 3 张图片属于 1 类,1 张图片属于 0 类。所以,它仍然给了我错误的计数结果

以上是关于在 keras 中使用 CNN 对图像进行二值分类时正确预测的总数的主要内容,如果未能解决你的问题,请参考以下文章

keras构建卷积神经网络(CNN(Convolutional Neural Networks))进行图像分类模型构建和学习

使用 LSTM 和 CNN 对 Keras 进行故障排除以进行时间序列分类

使用 Keras 的 CNN 深度学习模型中的 PCA

深度学习进阶,Keras视频分类

使用 3D CNN 进行 3D 图像分类

具有额外“维度”的图像分类