【详解】keras + predict_generator + ImageDataGenerator.flow_from_ditectory 进行预测

本文主要讲述在利用keras进行预测分类(不是训练)时,从文件夹中直接读取图片(直接利用flow_from_direction),并经过 ImageDataGenerator进行增强。
可以讲,这里面的坑有点多,而且很微小。
先说说有哪些坑:

  1. 注意测试的文件夹名称及结构,否则程序将读取不到图片;
  2. 设置好flow_from_directory的batch_size,否则预测的结果与图片不对应;
  3. 如何在预测之后与文件名对应起来
  4. 如果同时使用预测和评估(分别是predict_generator和evaluate_generator),一定要使用reset()来初始化一下predict_generator 和evaluate_generator对象;注意一些predict_generator和evaluate_genator是不一样的。

以下分别说明:
文件夹名称
如果你已经到了这一步,应该是已经训练过了。你可以看一下你训练时候的名字,这应该是一个包含文件夹的文件夹,这个文件夹下包含你的类,每一个类是一个文件夹,类文件夹下才是图像。
这里虽然是预测,但是也是同样的文件夹结构。也就是说这是一个二级文件夹,文件夹A-子文件夹-图片,这样的结构,文件夹A才是我们输入的名字:

test_datagen = ImageDataGenerator(rescale=1./255)

test_generator = test_datagen.flow_from_directory('/predict', target_size=(height, width),
batch_size=1,class_mode='categorical', shuffle=False,)

在这里插入图片描述
可以看我的文件夹结构

batch_size的设置

如果不知道怎么设置,就请设置为1,如上面我的代码。虽然可能变慢,但保证不会出错。
如果设置不合适,生成器就会重新采样(而采样是随机的),这样会使得名字和对应的预测结果不对应。

val_generator.reset()
pred = model.predict_generator(val_generator, verbose=1)

预测之后文件名与预测结果对应起来

这里我们需要明白两个东西。
第一个是我们建立了训练生成器时,可以调用这个对象查看代码里标签与我们的文件名有什么关系。
可以通过class.indices来看。

train_datagen = ImageDataGenerator(rescale=1./255, rotation_range=40, fill_mode='wrap')
train_generator = train_datagen.flow_from_directory('new_images', target_size=(height, width), batch_size=96)
labels = (train_generator.class_indices)

第二,在预测之后我们可以通过对象来看文件名

filenames = test_generator.filenames

最后,我们将上述东西给结合起来:

导入你的模型
导入你的参数

train_datagen = ImageDataGenerator(rescale=1./255, rotation_range=40, fill_mode='wrap')
train_generator = train_datagen.flow_from_directory('new_images', target_size=(height, width), batch_size=96)

val_datagen = ImageDataGenerator(rescale=1./255)
test_generator = test_datagen.flow_from_directory('AgriculturalDisease_validationset/predict', target_size=(height, width),batch_size=1,class_mode='categorical', shuffle=False,)

test_generator.reset()
pred = model.predict_generator(test_generator, verbose=1)

predicted_class_indices = np.argmax(pred, axis=1)
labels = (train_generator.class_indices)
label = dict((v,k) for k,v in labels.items())

# 建立代码标签与真实标签的关系
predictions = [label[i] for i in predicted_class_indices]

#建立预测结果和文件名之间的关系
filenames = test_generator.filenames
for idx in range(len(filenames )):
    print('predict  %d' % (int(predictions[idx])))
    print('title    %s' % filenames[idx])
    print('')

predict_generator和evaluate_generator预测与评估

预测,是指我们给出图片,然后程序预测图片是哪一类。不需要ground truth。
预测函数返回的结果就是概率值。
评估,是评估模型好不好,性能怎样,因此是需要标签的。
评估函数,返回的是你模型定义时候的评价指标,如损失和正确率,以loss, acc来表示。
而且使用预测函数,文件夹没有什么特殊要求,只需要满足本文第一个要求即可。
但是使用评估函数,我们需要文件夹下要有与训练时一样的文件夹数量。否则会报错
在这里插入图片描述
图中,我训练数据有61类,但是我的评估文件夹只有两类,所以会报错。

另外,我们需要注意到,如果我们同时使用了两个生成器,我们就需要对生成器进行reset,否则文件名等会乱七八糟。

test_generator.reset()
pred = model.predict_generator(test_generator, verbose=1)

英文参考

为何要点赞?

如果本文解决了你的困惑,不妨点个赞鼓励一下。
不管你信不信,也不管你同不同意,实际上,你的每一次点赞都标志着你自身的进步。而打赏乃是点赞的高级形式
曾经有无数个点赞的机会,但是我都没有好好珍惜,假如时光可以倒流,我一定为他们也为自己点赞。

  • 94
    点赞
  • 122
    收藏
    觉得还不错? 一键收藏
  • 26
    评论
评论 26
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值