【发布时间】:2019-06-15 14:37:48
【问题描述】:
我尝试使用 Keras ImageDataGenerator 来扩充我的图像数据。我的任务是回归任务,输入图像会产生另一个转换后的图像。到目前为止一切顺利,效果很好。
在这里,我想通过使用 ImageDataGenerator 来应用数据增强。为了以相同的方式转换两个图像,我使用了Keras docs 中描述的方法,其中描述了具有相应掩码的图像的转换。我的情况有点不同,因为我的图像已经加载并且不需要从目录中获取。此过程已在 another StackOverlow post 中描述。
为了验证我的实现,我首先使用它而不进行扩充,并使用 ImageDataGenerator 而不指定任何参数。根据Keras docs 中的类参考,这不应该改变图像。看到这个sn-p:
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(数据已经洗牌)
这些方法都没有帮助使结果更好。
【问题讨论】:
-
您是否尝试过手动查看其错误标记的内容以及错误标记后的结果是什么,您是否看到那里的模式或者是随机的,看看一些错误标记的数据。
-
我有一个回归任务,其中一个图像被转换为另一个图像。在这里很难看出它是否贴错标签。我唯一能说的是,正确的目标图像与输入图像一起使用。结果看起来像我对这种损失的预期。
-
你在尝试使用神经风格迁移吗?
-
并非如此。它是图像处理中的监督应用程序。
-
@anand_v.singh 当像this example 一样的Dataframe 中已经存在像素时,如何加载和增强图像?你能在那里回答吗?
标签: python image keras computer-vision data-augmentation