首页 > 解决方案 > 如何从 tf.keras.preprocessing.image_dataset_from_directory() 探索和修改创建的数据集?

问题描述

这是我使用该功能的方式:

dataset = tf.keras.preprocessing.image_dataset_from_directory(
    main_directory,
    labels='inferred',
    image_size=(299, 299),
    validation_split=0.1,
    subset='training',
    seed=123
)

我想像在这个例子中一样探索创建的数据集,特别是它被转换为数据框的部分pandas。但我的最低目标是检查标签和附加到它的文件数量,只是为了检查它是否确实按预期创建了数据集(子目录是其中图像的相应标签)。

需要明确的main_directory是,设置如下:

main_directory
- class_a
  - 000.jpg
  - ...
- class_b
  - 100.jpg
  - ...

我希望看到数据集显示其信息,如下所示:

label     number of images
class_a   100
class_b   100

此外,是否可以删除数据集中的标签和相应的图像?这个想法是如果相应的图像数量小于某个数量或不同的指标,则删除它们。当然可以通过其他方式在此功能之外完成,但我想知道它是否确实可能,如果可以,如何。

编辑:对于额外的上下文,所有这一切的最终目标是训练一个像这样的预训练模型,将本地图像划分为以其类命名的文件夹。如果有更好的方法包括不使用该功能并满足此最终目标,那么它同样受欢迎。谢谢!

标签: pythontensorflowmachine-learningkerasdeep-learning

解决方案


我认为使用它glob2来获取所有文件名,根据需要处理它们,然后制作一个简单的加载函数来替换image_dataset_from_directory.

获取所有文件:

files = glob2.glob('class_*\\*.jpg')

然后根据需要操作此文件名列表。

然后,创建一个函数来加载图像:

def load(file_path):
    img = tf.io.read_file(file_path)
    img = tf.image.decode_jpeg(img, channels=3)
    img = tf.image.convert_image_dtype(img, tf.float32)
    img = tf.image.resize(img, size=(299, 299))
    label = tf.strings.split(file_path, os.sep)[0]
    label = tf.cast(tf.equal(label, 'class_a'), tf.int32)
    return img, label

然后为训练创建数据集:

train_ds = tf.data.Dataset.from_tensor_slices(files).map(load).batch(4)

然后训练:

model.fit(train_ds)

推荐阅读