2

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

然后我偶然发现了这个flow方法,但遗憾的是没有很好的例子来使用它。我能找到的唯一一件事是人们正在使用它将增强数据直接输出到硬盘驱动器。我想要做的是(像 with 一样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不应该转换任何图像。这怎么可能?

4

1 回答 1

4

您的图像很可能尚未标准化(即像素值在 [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)而言效率不高。同样的事情也适用于 的steps论点predict_generator

于 2019-07-25T07:58:46.517 回答