在 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))进行图像分类模型构建和学习