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文件夹中的图像文件进行预测?
如果您只想执行预测,则可以通过如下简单的 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)
| 归档时间: |
|
| 查看次数: |
6497 次 |
| 最近记录: |