正确使用ImageDataGenerator流功能

时间:2019-07-24 14:56:50

标签: python tensorflow machine-learning keras data-augmentation

我试图在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 :(得分: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,则每个时期将有40批。因此,您需要将steps_per_epoch设置为40(或者更好的是,将其设置为trainX.shape[0])。虽然,如果您有更多图像,则在使用所有可用资源(即GPU / CPU)方面,批处理大小为1可能不会很有效。同样的情况也适用于steps的{​​{1}}参数。