在keras中使用CNN的图像的二进制分类中正确预测的总和

时间:2017-09-06 14:05:28

标签: machine-learning keras conv-neural-network

任何人都可以帮助我。我已成功使用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级?

谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

score[0]将为您提供损失(在您的情况下为二进制交叉熵),而score[1]包含所需的二进制精度。

有关详细信息,请参阅docs(向下滚动查找evaluate)。

答案 1 :(得分:0)

您必须拥有正确预测的数据样本数组吗?那么你也可以加载这些数据。保留你的代码,

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)))