ImageDataGenerator流函数的正确使用

Posted

技术标签:

【中文标题】ImageDataGenerator流函数的正确使用【英文标题】:Correct usage of ImageDataGenerator flow function 【发布时间】:2019-12-02 18:44:08 【问题描述】:

我正在尝试将数据增强用于 Keras 中的回归模型。因此,我想使用 Keras 的 ImageDataGenerator 类。我能找到的关于该任务的几乎所有教程都有分类方法,因此使用方法flow_from_directory。但是对于回归任务,这是行不通的。

然后我偶然发现了flow 方法,但遗憾的是没有使用它的好例子。我唯一能找到的是人们正在使用它将增强数据直接输出到硬盘驱动器。我想要做的是(如flow_from_directory)使用生成器并将其放入fit_generator 函数中。但是我得到的结果不是很好,我不确定是增强数据还是我使用了flow 方法错误。这是我所做的:

# Load the data (images will be model input, labels will be model output)
# NOTE:    
# images.shape = (45, 256, 256, 1)
# labels.shape = (45, 2)
images, labels = load_dataset(base_path=os.getcwd(),
                          type=dataset_type.FrontalPrimary)

# split into training and test data
    split = train_test_split(images, labels, test_size=0.10, random_state=42)
(trainX, testX, trainY, testY) = split

# make data fit model
trainX = np.reshape(trainX, (trainX.shape[0], trainX.shape[1], trainX.shape[2], 1))
testX = np.reshape(testX, (testX .shape[0], testX .shape[1], testX .shape[2], 1))

# create generator for each, training and test
data_gen = ImageDataGenerator(
    rotation_range=10,
    width_shift_range=0.1,
    height_shift_range=0.1,
    fill_mode='nearest',
    validation_split=0.15)

train_generator = data_gen.flow(trainX, trainY, batch_size=1)
test_generator = data_gen.flow(testX, testY, batch_size=1)

# train model
model = cnn.get_model()
model.fit_generator(train_generator, steps_per_epoch=64, epochs=500)

# make predictions on the testing data
preds = model.predict_generator(test_generator, steps=10)

编辑:

我注意到了别的东西。如果我像下面这样设置data_gen

data_gen = ImageDataGenerator()

或者如果数据尚未标准化

data_gen = ImageDataGenerator(rescale=1/255.)

即使ImageDataGenerator 不应该转换任何图像,结果也与我在没有数据增强的情况下测试的结果相去甚远。这怎么可能?

【问题讨论】:

【参考方案1】:

很可能您的图像尚未标准化(即像素值在 [0,255] 范围内)。所以你需要对它们进行规范化,一种简单的方法是使用rescale 参数:

data_gen = ImageDataGenerator(rescale=1/255., ...)

其他几点:

您正在使用增强数据进行训练,这完全没问题。但请确保您也想使用增强数据进行测试。否则,对于测试阶段,您需要创建一个新的 ImageDataGenerator 实例,它不会对测试图像进​​行任何扩充:

test_data_gen = ImageDataGenerator(rescale=1/255.)
test_generator = test_data_gen.flow(testX, testY)

如果你有 40 张训练图像(占整个数据的 90%)并设置batch_size=1,那么每个 epoch 将有 40 个批次。所以你需要将steps_per_epoch相应地设置为40(或者更好,设置为trainX.shape[0])。虽然,如果您有更多图像,那么批量大小为 1 就使用所有可用资源(即 GPU/CPU)而言效率不高。同样的事情也适用于predict_generatorsteps 参数。

【讨论】:

感谢您的回答。我会尽快看看你的建议 所以图像已经在 (0,1) 的范围内。我在load_dataset 中进行了标准化。我已经更新了训练和测试的步骤。但我不明白另一点。您说我也应该使用增强数据进行测试,但我不是已经这样做了吗?不幸的是,随着步长的更新,我的预测并没有变得更好 @Codey 不,我不是说您应该在测试阶段进行扩充。我说您目前正在这样做,因为您使用的是相同的ImageDataGenerator 实例,即data_gen,用于训练(即test_generator = data_gen.flow(testX, testY, batch_size=1))。所以我只是说确保你是有意这样做的。我没主意了。请编辑您的问题并添加模型的定义;也许那里有错误。

以上是关于ImageDataGenerator流函数的正确使用的主要内容,如果未能解决你的问题,请参考以下文章

Keras ImageDataGenerator 不处理符号链接文件

ImageDataGenerator

keras训练函数fit和fit_generator对比,图像生成器ImageDataGenerator数据增强

TensorFlow2.x —— mageDataGenerator

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

Tensorflow2中ImageDataGenerator中flow_from_directory()和image_dataset_from_directory()区别