【问题标题】:Fit Image augmentations to training data using flow_from_directory使用 flow_from_directory 将图像增强拟合到训练数据
【发布时间】:2017-10-12 09:07:03
【问题描述】:

我想在 Keras 中使用图像增强。我当前的代码如下所示:

# define image augmentations
train_datagen = ImageDataGenerator(
featurewise_center=True,
featurewise_std_normalization=True,
zca_whitening=True)

# generate image batches from directory
train_datagen.flow_from_directory(train_dir)

当我使用它运行模型时,我收到以下错误:

"ImageDataGenerator specifies `featurewise_std_normalization`, but it hasn't been fit on any training data."

但我没有找到关于如何使用train_dataget.fit()flow_from_directory 的明确信息。

【问题讨论】:

    标签: python machine-learning keras deep-learning


    【解决方案1】:

    你说得对,docs 在这方面不是很明白...

    您需要的实际上是一个 4 步过程:

    1. 定义数据增强
    2. 适合增强
    3. 使用flow_from_directory() 设置您的生成器
    4. 使用fit_generator() 训练您的模型

    这是假设图像分类案例的必要代码:

    # define data augmentation configuration
    train_datagen = ImageDataGenerator(featurewise_center=True,
                                       featurewise_std_normalization=True,
                                       zca_whitening=True)
    
    # fit the data augmentation
    train_datagen.fit(x_train)
    
    # setup generator
    train_generator = train_datagen.flow_from_directory(
            train_data_dir,
            target_size=(img_height, img_width),
            batch_size=batch_size,
            class_mode='categorical')
    
    # train model
    model.fit_generator(
        train_generator,
        steps_per_epoch=nb_train_samples,
        epochs=epochs,
        validation_data=validation_generator, # optional - if used needs to be defined
        validation_steps=nb_validation_samples) 
        
    

    显然,有几个参数需要定义(train_data_dirnb_train_samples 等),但希望你能明白。

    如果您还需要使用validation_generator,如我的示例所示,则应以与train_generator 相同的方式定义。

    更新(评论后)

    第 2 步需要一些讨论;这里,x_train 是实际数据,理想情况下,它应该适合主内存。还有(documentation),这一步是

    仅当 featurewise_center 或 featurewise_std_normalization 或 zca_whitening 时才需要。

    但是,在许多实际案例中,要求所有训练数据都放入内存显然是不现实的。在这种情况下如何对数据进行中心化/标准化/白色化本身就是一个(巨大的)子领域,并且可以说是 Spark 等大数据处理框架存在的主要原因。

    那么,在实践中该怎么做呢?那么,在这种情况下,下一个合乎逻辑的操作是采样您的数据;事实上,这正是社区所建议的——这里是 Keras 的创造者 Francois Chollet,Working with large datasets like Imagenet

    datagen.fit(X_sample) # let's say X_sample is a small-ish but statistically representative sample of your data
    

    还有来自ongoing open discussion 的关于扩展ImageDataGenerator 的另一句话(强调):

    fit 是 feature-wise 标准化和 ZCA 所必需的,它只需要一个数组作为参数,不适合目录。 现在,我们需要手动读取图像的一个子集以适应目录。一个想法是我们可以更改fit() 以接受生成器本身(flow_from_directory),当然,在拟合期间应该禁用标准化。

    【讨论】:

    • 谢谢沙漠航行者。这就是我设置它的方式。但这正是我不明白的第 2 点。如何在 train_datagen.fit(x_train) 中定义 x_train?它不会使用我的 training_folder 作为输入,并且由于内存限制,我无法从所有图像中创建一个 numpy 数组。
    • 这真的很有帮助!像这样的事情使初学者很难使用 keras。甚至 chollets book 在这个问题上也不是很清楚!
    • steps_per_epoch 不应该是 nb_train_samples/batch_size 吗?
    • @jul 你是对的,但正如我所说,这只是给出这个想法的一般草图
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2018-12-25
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 2018-09-17
    相关资源
    最近更新 更多