python - 如何使用批处理为大型数据集拟合 Keras ImageDataGenerator
问题描述
我想使用 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)
解决方案
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),那么对于提供的代码和您参考的教程,请确保您替换了导入/神经网络创建片段:
from keras.x.y.z import A
和
from tensorflow.keras.x.y.z import A
推荐阅读
- json - 由 reflect.New() 制成的 JSON 切片在 golang 中给出 null
- sql - 使用 postgis 连接的 Postgresql 更新
- java - 如何将 Kotlin 文件添加到旧的 android java 项目?
- java - 使用 SPQR 进行分页的推荐方法是什么?
- python - Pandas:按双月日期字段分组
- dart - dart 中的节流函数执行
- javascript - 为什么 string.length 没有更新?
- android - 错误 android.database.sqlite.SQLiteException:没有这样的列:更新 SQLite 数据库时
- java - 长按主页按钮时如何替换谷歌搜索
- maven - 我们可以使用 proguard 混淆 java web 应用程序吗?