如何使用批处理为大型数据集拟合 Keras ImageDataGenerator

Posted

技术标签:

【中文标题】如何使用批处理为大型数据集拟合 Keras ImageDataGenerator【英文标题】:How to fit Keras ImageDataGenerator for large data sets using batches 【发布时间】:2019-11-27 06:40:57 【问题描述】:

我想使用 Keras ImageDataGenerator 进行数据增强。 为此,我必须使用我的训练数据作为参数在实例化的 ImageDataGenerator 对象上调用 .fit() 函数,如下所示。

image_datagen = ImageDataGenerator(featurewise_center=True, rotation_range=90)
image_datagen.fit(X_train, augment=True)
train_generator = image_datagen.flow_from_directory('data/images')
model.fit_generator(train_generator, steps_per_epoch=2000, epochs=50)

但是,我的训练数据集太大而无法立即加载到内存中。 因此,我想使用我的训练数据子集分几个步骤来拟合生成器。

有没有办法做到这一点?

我想到的一个潜在解决方案是使用自定义生成器函数加载我的训练数据批次,并在循环中多次拟合图像生成器。但是,我不确定 ImageDataGenerator 的拟合函数是否可以以这种方式使用,因为它可能会在每种拟合方法上重置。

作为一个例子来说明它是如何工作的:

def custom_train_generator():
    # Code loading training data subsets X_batch
    yield X_batch


image_datagen = ImageDataGenerator(featurewise_center=True, rotation_range=90)
gen = custom_train_generator()

for batch in gen:
    image_datagen.fit(batch, augment=True)

train_generator = image_datagen.flow_from_directory('data/images')
model.fit_generator(train_generator, steps_per_epoch=2000, epochs=50)

【问题讨论】:

【参考方案1】:

ImageDataGenerator()为您提供批量加载数据的可能性;您实际上可以在您的fit_generator() 方法中使用参数batch_size,它适用于ImageDataGenerator();无需从头开始编写生成器(仅用于良好实践)。

重要提示:

从 TensorFlow 2.1 开始,.fit_generator() 已被弃用,您应该使用 .fit()

示例取自 Keras 官方文档:

datagen = ImageDataGenerator(
    featurewise_center=True,
    featurewise_std_normalization=True,
    rotation_range=20,
    width_shift_range=0.2,
    height_shift_range=0.2,
    horizontal_flip=True)

# compute quantities required for featurewise normalization
# (std, mean, and principal components if ZCA whitening is applied)
datagen.fit(x_train)

# TF <= 2.0
# fits the model on batches with real-time data augmentation:
model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),
                    steps_per_epoch=len(x_train) // 32, epochs=epochs)

#TF >= 2.1
model.fit(datagen.flow(x_train, y_train, batch_size=32),
         steps_per_epoch=len(x_train) // 32, epochs=epochs)

我建议阅读这篇关于 ImageDataGenenerator 和 Augmentation 的优秀文章:https://machinelearningmastery.com/how-to-configure-image-data-augmentation-when-training-deep-learning-neural-networks/

您的问题的解决方案在于这行代码(简单流程或flow_from_directory):

# prepare iterator
it = datagen.flow(samples, batch_size=1)

要创建您自己的 DataGenerator,请查看此链接(作为起点):https://stanford.edu/~shervine/blog/keras-how-to-generate-data-on-the-fly

重要提示(2):

如果您使用来自 Tensorflow 的 Keras(Tensorflow 中的 Keras),那么对于提供的代码和您参考的教程,请确保替换导入/神经网络创建 sn-ps:

from keras.x.y.z import A

from tensorflow.keras.x.y.z import A

【讨论】:

感谢您的回答和文章!我明白了,并不总是需要安装图像生成器本身,所以我可以省略它,因此我不需要加载整个 x_train。然而,我读到对于某些增强操作(例如缩放),我必须在图像数据生成器上使用 .fit(),然后才能调用 .flow() 或 .flow_from_directory()。有没有办法使用datagen.fit(x_train) 而不必一次加载整个x_train? 我和@C.S. 有同样的问题。有什么办法可以按照他的要求去做吗? 抱歉,回答迟了。您可以创建自己的 DataGenerator(子类化 tensorflow.keras.utils.Sequence)并在批处理级别应用图像增强。一个很好的起点是这个链接:stanford.edu/~shervine/blog/… @TimbusCalin 当像this example 一样的Dataframe 中已经存在像素时,如何加载和增强图像?你能在那里回答吗?

以上是关于如何使用批处理为大型数据集拟合 Keras ImageDataGenerator的主要内容,如果未能解决你的问题,请参考以下文章

Keras Resnet-50 图像分类过拟合

如何在 keras 中拟合两个连接 LSTM 的模型?

Keras:过拟合模型?

将 HDF5 文件中的大型数据集读入 x_train 并在 keras 模型中使用

在 keras 中拟合生成器和数据增强

keras 如何保存训练集与验证集正确率的差最小那次epoch的网络及权重