我尝试使用Keras ImageDataGenerator
扩充图像数据。我的任务是回归任务,其中输入图像会生成另一个变换后的图像。到目前为止,一切都很好。
在这里,我想使用ImageDataGenerator
应用数据增强。为了以相同的方式变换两个图像,我使用了Keras docs中描述的方法,其中描述了具有相应蒙版的图像的变换。我的情况有些不同,因为我的图像已经加载,不需要从目录中提取。 another StackOverlow post中已经描述了此过程。
为了验证我的实现,我首先使用它而不进行扩充,并且使用ImageDataGenerator
而不指定任何参数。根据Keras docs中的类引用,这不应更改图像。请参阅以下代码段:
img_val = img[0:split_seperator]
img_train = img[split_seperator:]
target_val = target[0:split_seperator]
target_train = target[split_seperator:]
data_gen_args = dict()
# define data preparation
src_datagen = ImageDataGenerator(**data_gen_args)
target_datagen = ImageDataGenerator(**data_gen_args)
# fit parameters from data
seed = 1
src_datagen.fit(img_train, augment=False, seed=seed)
target_datagen.fit(target_train, augment=False, seed=seed)
training_generator = zip(
src_datagen.flow(img_train, batch_size=batch_size_training, seed=seed),
target_datagen.flow(target_train, batch_size=batch_size_training, seed=seed))
_ = model.fit_generator(
generator=training_generator,
steps_per_epoch=image_train.shape[0] // batch_size_training,
epochs=num_epochs, verbose=1,
validation_data=(img_val, target_val), callbacks=callbacks)
不幸的是,我的实现似乎有一些问题。我没有得到预期的表演。验证损失在某种程度上稳定在某个值附近,并且仅略有下降(请参见下图)。我希望在这里,因为我没有使用任何增强,所以损失与未增强的基线相同。
相比之下,我没有
ImageDataGenerator
的训练看起来像_ = model.fit(img, target,
batch_size=batch_size_training,
epochs=num_epochs, verbose=1,
validation_split=0.2, callbacks=cb)
我想我在某种程度上与
ImageDataGenerator
,flow
和fit
函数的用法混淆了。所以我的问题是:是应用的功能
fit
或flow
之一是多余的并导致此现象?我有实施上的问题吗?
这种实施方式大体上有意义吗?
设置验证集修订是否有意义,还是应该增加它?
更新(2019-01-23&续):
到目前为止,我已经尝试过(响应答案):
也为验证数据创建一个生成器
删除应用的拟合函数
在流功能中设置
shuffle=True
(数据已经混洗)这些方法都没有帮助改善结果。
最佳答案
终于我明白了您要做什么,这应该可以完成工作。
aug = ImageDataGenerator(**data_gen_args)
# train the network
H = model.fit_generator(aug.flow(img_train, target_train, batch_size=image_train.shape[0]),
validation_data=(img_val, target_val), steps_per_epoch=image_train.shape[0] // BS,
epochs=EPOCHS)
让我知道这个是否奏效。