繁体   English   中英

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

[英]How should I use mode.predict_generator to evaluate model performance in a 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 运行良好

在我的 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 似乎出错了。

问题是默认_flow_from_directory_使用 shuffle = True 如果 shuffle 为 False,则预测是正确的。 然而,使用验证数据集来评估训练似乎是正确的,即使 shuffle 为 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM