我应如何使用mode.predict_generator评估混淆矩阵中的模型性能?

时间:2019-06-21 00:05:17

标签: python-3.x tensorflow machine-learning keras confusion-matrix

我正在尝试使用混淆矩阵评估常见猫狗过滤数据集中的转移学习模型。我已经基于tensorflow的转移学习教程中的代码。训练的精度图显示了90%以上的精度。

但是,使用生成器获取真实的标签和使用model.predict_generator获取预测数组会引发不一致的结果。首先,准确性不稳定,如果您第二次运行预测,它将更改值。其次,与对单个实例的model.predict相比,使用model.predict_generator进行的预测似乎是错误的。

为了快速测试基于 ImageDataGenerator 的混淆矩阵,我下载了5张猫的图像和5张狗的图像。然后,我从文件夹中创建了另一个生成器,并检查了标签和类是否与培训相同。

两种奇怪的行为 之后,我只是使用sklearn度量标准混淆矩阵,使用model.predict_generator以及从生成器中获得的标签作为真实标签来评估预测。

在第一次跑步时,我的准确度是0.9,并说加油!但是,如果我第二次尝试使用model.predict_generator,它会为数组输出和精度下降到0.5抛出其他值。之后,它不再改变了。...什么结果正确?为什么会改变?

我一直注意到您必须运行两次才能获得最终结果,但是获得的结果是错误的。我编写了一些代码来分别测试每个图像,并且预测没有错。那我在做什么错?还是发电机不适用于这种情况。这有点令人困惑

代码可以在我的github存储库中破解,并且如果没有gpu,也可以在google colaboratory中运行。实际上,在我的小东芝卫星中,只有2 gb和300 cuda的nvidia gpu可以很好地运行

complete code at my git

代码被组织为jupyter笔记本,但是在这里我添加了代码 转移学习基于https://www.tensorflow.org/tutorials/images/transfer_learning

要创建生成器:

test_base_dir = '.'
test_dir = os.path.join( test_base_dir, 'test')
test_datagen_2 = ImageDataGenerator( rescale = 1.0/255. )
test_generator = test_datagen_2.flow_from_directory( test_dir,
                                                     batch_size  = 1,
                                                     class_mode  = binary', 
                                                     target_size = (image_size, image_size))

为了预测:

   filenames = test_generator.filenames
   nb_samples = len(filenames)
   y_predict = model.predict_generator(test_generator,steps = 
   nb_samples)
   y_predict

我最终使用numpy来最终使用混淆矩阵指标


from sklearn.metrics  import confusion_matrix
cm = confusion_matrix(y_true=test_generator.labels, y_pred=y_predict_rounded)
cm

手动验证是:

def prediction(path_img):
img = image.load_img(path_img, target_size=(150,150))
x = image.img_to_array(img)
x = x/255.
x = np.expand_dims(x, axis=0)
classes = model.predict(x)
plt.imshow(img)
if classes > 0.5:
    print(path_img.split('/')[-1]+' is a dog')
else:
     print(path_img.split('/')[-1]+' is a cat')   
return classes

我使用以下方式:

y_pred_m = []
files=[]
for filename in os.listdir(test_dir):
    file = test_dir+'/'+filename
    for item in os.listdir(file):
        file2 = file+'/'+item
        if file2.split('.')[-1]=='jpg':
            files.append(file2)

然后预测:

prediction_array = [prediction(img) for img in files]

np.round(prediction_array, decimals=0)

预期结果应该有一个混淆度,其准确性水平与训练相似。由于每个示例的验证似乎在预测中没有错误,因此model.predict_generate似乎出错。

1 个答案:

答案 0 :(得分:0)

问题在于,作为默认 _flow_from_directory_ 使用shuffle = True 。如果改组为False,则预测是正确的。但是,即使洗牌是True,使用验证数据集评估训练似乎也正确。我已更新git,以填充这些更改

# Flow validation images in batches of 20 using test_datagen generator
test_generator =  test_datagen_2.flow_from_directory( test_dir,
                                                  batch_size  = 1,
                                                  class_mode  = 'binary', 
                                                  target_size = (image_size, 
image_size),
                                                  shuffle = False)