我试图在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
不应该转换任何图像,结果也不如没有数据扩充时的测试结果。那怎么可能?
答案 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}}参数。