如何从子目录加载张量流中的数据

Posted

技术标签:

【中文标题】如何从子目录加载张量流中的数据【英文标题】:How to load data in tensorflow from subdirectories 【发布时间】:2021-02-05 00:30:00 【问题描述】:

我有一部分 ImageNet 数据包含在本地的子文件夹中,其中每个子文件夹代表一类图像。可能有数百个类,因此有子文件夹,每个子文件夹可以包含数百个图像。下面是一个包含文件夹子集的结构示例。我想在 tensorflow 中训练一个分类模型,但我不确定如何格式化和加载数据,因为不同文件夹中不同图像类的这种结构以及类标签是文件夹的名称。通常我只是使用 tensorflow 中已经存在的数据集,例如 mnist 或 cifar10,它们已格式化且易于使用。

【问题讨论】:

那么有很多类别,这些类别是从文件夹名称推断出来的? @yuRa 是的,没错! 我已经添加了答案。 太棒了,谢谢! 【参考方案1】:

您可以使用tf.keras.preprocessing.image_dataset_from_directory()

你的目录结构应该是这样的,但是有更多的类:

main_directory/
...class_a/
......a_image_1.jpg
......a_image_2.jpg
...class_b/
......b_image_1.jpg
......b_image_2.jpg

我建议您在此步骤之前拆分数据集,因为我认为数据是随机拆分的,而不是分层抽样(如果您的数据集不平衡,请先执行此操作,不要使用验证拆分为您执行此操作我不确定如何拆分的性质,因为没有提到它)。

示例:

train_dataset = image_dataset_from_directory(
    directory=TRAIN_DIR,
    labels="inferred",
    label_mode="categorical",
    class_names=["0", "10", "5"],
    image_size=SIZE,
    seed=SEED,
    subset=None,
    interpolation="bilinear",
    follow_links=False,
)

您必须设置的重要事项:

    必须推断标签,其中图像的标签是根据目录结构生成的,因此它遵循类的顺序。

    标签模式必须设置为“分类”,将标签编码为分类向量。

    类名您可以自行设置,您必须在其中列出目录中文件夹的顺序,否则该顺序基于字母数字顺序。由于您有很多文件夹,您可以在这里做的是使用os.walk(directory) 按目录顺序获取目录列表。

    图像大小您可以将图像大小调整为相同大小。根据您使用的模型执行此操作,即 MobileNet 接受 (224,224),因此您可以将其设置为 (224,224)。

More information here.

【讨论】:

【参考方案2】:

您可以使用 ImageDataGenerator.flow_from_directory。文档是here. 假设您的子目录位于名为 main_dir 的目录中。设置要处理的图片大小,下面我用的是224 X 224,也指定了彩色图片。 class_mode 设置为“分类”,因此当您编译模型时,使用分类交叉熵作为损失。然后使用下面的代码。

train_gen=ImageDataGenerator(validation_split=.2,rescale=1/255)
train_gen=train_gen.flow_from_directory(main_dir,  target_size=(256, 256),
    color_mode="rgb", class_mode="categorical", batch_size=32, shuffle=True,
    seed=123, subset='training)
valid_gen=train_gen.flow_from_directory(main_dir,  target_size=(224, 224),
    color_mode="rgb", class_mode="categorical", batch_size=32, shuffle=False,
    seed=123, subset='validation)
# make and compile your model then fit the model per below
history=model.fit(x=train_gen,  epochs=20, verbose=1, validation_data=valid_gen,
                 shuffle=True,  initial_epoch=0) 

【讨论】:

嘿,如果我只想要特定的子目录怎么办:/ 在这种情况下,我建议使用 flow_from_dataframe。您将不得不创建只选择所需子目录的自定义数据框,但这并不难。

以上是关于如何从子目录加载张量流中的数据的主要内容,如果未能解决你的问题,请参考以下文章

当切片本身是张量流中的张量时如何进行切片分配

如何根据张量流中的列条件获取张量值的索引

如何计算张量流中RNN的困惑度

张量流中的ocr实现

张量流中的最小 RNN 示例

在张量流中改变张量的尺度