Keras:ImageDataGenerator 性能不佳
Keras: poor performance with ImageDataGenerator
我尝试使用 Keras ImageDataGenerator
来增强我的图像数据。我的任务是回归任务,其中输入图像生成另一个转换后的图像。到目前为止一切顺利,效果很好。
在这里,我想通过使用 ImageDataGenerator
来应用数据扩充。为了以相同的方式转换两个图像,我使用了 Keras docs, where a transformation of an image with a corresponding mask is described. My case is a little bit different, as my images are already loaded and don't need to be fetched from a directory. This procedure was already described in .
中描述的方法
为了验证我的实现,我首先在没有扩充的情况下使用它,并在没有指定任何参数的情况下使用 ImageDataGenerator
。根据 Keras docs 中的 class 参考,这不应该改变图像。请参阅此片段:
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)
让我知道这是否有效。
我尝试使用 Keras ImageDataGenerator
来增强我的图像数据。我的任务是回归任务,其中输入图像生成另一个转换后的图像。到目前为止一切顺利,效果很好。
在这里,我想通过使用 ImageDataGenerator
来应用数据扩充。为了以相同的方式转换两个图像,我使用了 Keras docs, where a transformation of an image with a corresponding mask is described. My case is a little bit different, as my images are already loaded and don't need to be fetched from a directory. This procedure was already described in
为了验证我的实现,我首先在没有扩充的情况下使用它,并在没有指定任何参数的情况下使用 ImageDataGenerator
。根据 Keras docs 中的 class 参考,这不应该改变图像。请参阅此片段:
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)
让我知道这是否有效。