如何使用 predict_generator 对 Keras 中的未标记测试数据进行预测?

use*_*_12 2 python classification keras tensorflow

我正在尝试构建图像分类模型。这是一个 4 类图像分类。这是我用于构建图像生成器和运行训练的代码:

train_datagen = ImageDataGenerator(rescale=1./255.,
                               rotation_range=30,
                               horizontal_flip=True,
                               validation_split=0.1)


train_generator = image_gen.flow_from_directory(train_dir, target_size=(299, 299), 
                                                class_mode='categorical', batch_size=20,
                                                subset='training')

validation_generator = image_gen.flow_from_directory(train_dir, target_size=(299, 299), 
                                                class_mode='categorical', batch_size=20,
                                                subset='validation')

model.compile(Adam(learning_rate=0.001), loss='categorical_crossentropy',
                                         metrics=['accuracy'])

model.fit_generator(train_generator, steps_per_epoch=int(440/20), epochs=20, 
                              validation_data=validation_generator, 
                              validation_steps=int(42/20))
Run Code Online (Sandbox Code Playgroud)

我能够完美地进行训练和验证工作,因为训练目录中的图像存储在每个班级的单独文件夹中。但是,正如您在下面看到的,测试目录有 100 个图像,其中没有文件夹。它也没有任何标签,只包含图像文件。

如何使用 Keras对test文件夹中的图像文件进行预测?

数据集目录结构

tod*_*day 8

如果您只想执行预测,则可以通过如下简单的 hack 加载图像:

test_datagen = ImageDataGenerator(rescale=1/255.)

test_generator = test_datagen('PATH_TO_DATASET_DIR/Dataset',
                              # only read images from `test` directory
                              classes=['test'],
                              # don't generate labels
                              class_mode=None,
                              # don't shuffle
                              shuffle=False,
                              # use same size as in training
                              target_size=(299, 299))

preds = model.predict_generator(test_generator)
Run Code Online (Sandbox Code Playgroud)

您可以访问test_generator.filenames获取相应文件名的列表,以便将它们映射到相应的预测。


更新(根据评论部分的要求):如果要将预测类映射到文件名,首先必须找到预测类。如果您的模型是分类模型,那么它可能有一个 softmax 层作为分类器。所以中的值preds将是概率。使用np.argmax方法找到概率最高的索引:

preds_cls_idx = preds.argmax(axis=-1)
Run Code Online (Sandbox Code Playgroud)

因此,这为您提供了预测类别的索引。现在我们需要将索引映射到它们的字符串标签(即“汽车”、“自行车”等),这些标签由训练生成器在class_indices属性中提供:

import numpy as np

idx_to_cls = {v: k for k, v in train_generator.class_indices.items()}
preds_cls = np.vectorize(idx_to_cls.get)(preds_cls_idx)
filenames_to_cls = list(zip(test_generator.filenames, preds_cls))
Run Code Online (Sandbox Code Playgroud)