kedro:使用keras ImageDataGenerator训练图像分类器

时间:2020-10-05 15:49:35

标签: python tensorflow keras kedro

在处理图像和keras ImageDataGenerator时应使用哪个kedro数据集?我知道有ImageDataset,但是图像数量太大,无法容纳在内存中。 keras ImageDataGenerator真正需要的只是图像数据集的本地文件夹位置,格式为:

data/
    train/
        dogs/
            dog001.jpg
            dog002.jpg
            ...
        cats/
            cat001.jpg
            cat002.jpg
            ...
    validation/
        dogs/
            dog001.jpg
            dog002.jpg
            ...
        cats/
            cat001.jpg
            cat002.jpg
            ...

可以使用指定数据位置的参数,但是我认为数据的适当位置应该是数据目录。有没有一种简单的方法可以在“数据目录”中指定此数据位置?

2 个答案:

答案 0 :(得分:1)

如何在parameters.yml中设置路径,然后将其读取为ImageDataGenerator的输入。看起来可能像这样:

train_dogs_location: data/train/dogs/

根据最佳示例修改上述示例。 您也可以考虑为conf/base/globals.yml文件中的所有数据集设置全局路径。例如,对于您的根数据文件夹。

答案 1 :(得分:1)

您认为问题中有两个部分需要分开;

  1. 是否可以配置自定义ImageDataGenerator数据集? (TLDR;是)
  2. 是否可以使用与我的用例相匹配的文件路径参数来配置上述内容? (TLDR;是的,但是您可能不希望目录结构成为目录结构的默认视图,因为其他用户也可能无法使用它。)

是否可以配置自定义ImageDataGenerator数据集?

这里有一些不完整的python代码,可用于构建自定义数据集。如果您想要这样的解决方案,我会把它留给您使用,以使其正常工作。在Kedro Github Repo中查看示例数据集以获取灵感,并从kedro readthedocs中获取tutorial on creating custom datasets

import tensorflow as tf 
from kedro.io.core import AbstractDataSet

class ImageDataGeneratorDataSet(AbstractDataSet):

    def __init__(
        self,
        filepath: str,
        load_args: Dict[str, Any] = None,
        save_args: Dict[str, Any] = None):
        
        self.filepath = filepath
        self.load_args = load_args
        self.save_args = save_args 


    def load(self):
        generator = tf.keras.preprocessing.image.ImageDataGenerator(**self.load_args)
        return generator.flow_from_directory(self.filepath)

    def save(self, data):
        raise Exception("Saving with the ImageDataGeneratorDataSet is not supported")

2:是否可以使用与我的用例匹配的文件路径参数来配置上述内容?

虽然我们可以修改上述内容以接受一些参数并返回不同的迭代器,但是如果目录结构不同,这可能会给我们带来问题。这是因为参数化很大程度上依赖于通用约定。

如果您的约定为data/{train/validation}/{dog/cat}/images...,则提取和应用参数的解决方案可能会与训练/验证和狗/猫的各自顺序相关联,并且可能不适用于拥有约定的其他用户的data/{dog/cat}/{train/validation}/images...

可能会有更好的模式:实施解决方案(如我在第一部分中概述的那样),在目录中为每个不同的训练/验证数据注册一个数据集,并在运行时将迭代器合并到您的节点来创建训练和验证迭代器。

例如,您将拥有数据集train_cats,train_dogs,validation_cats,validation_dogs。在节点内,您可以将这些迭代器压缩在一起(请参见https://stackoverflow.com/a/243902/13341083)。

如果您最终采用这种方法,请提高PR并做出贡献:)祝您好运