我们已经知道,将数据输入神经网络之前,应该将数据格式化为经过预处理的浮点数张量。现在,数据以JPEG文件的形式保存在硬盘中,所以数据预处理步骤大致如下。
读取图像文件。将JPEG文件解码为RGB像素网格。将这些像素网格转换为浮点数张量。将像素值(0-255范围内)缩放到[0,1]区间(正如你所知,神经网络喜欢处理较小的输入值)。这些步骤可能看起来有点吓人,但是Keras拥有自动完成这些步骤的工具。Keras有一个图像处理辅助工具的模块,位于keras.preprocessing.image。特别地,它包含ImageDataGenerator类,可以快速创建Python生成器,能够将硬盘上的图像文件自动转换为预处理好的张量批量。下面我们将用到这个类。
from keras.preprocessing.image import ImageDataGenerator train_datagen = ImageDataGenerator(rescale=1./255) test_datagen = ImageDataGenerator(rescale=1./255) train_generator = train_datagen.flow_from_directory( train_dir, target_size = (150,150), batch_size = 20, class_mode='binary') validation_generator = test_datagen.flow_from_directory( validation_dir, target_size = (150,150), batch_size = 20, class_mode='binary')我们看一下其中一个生成器的输出:它生成了150x150的RGB图像[形状为(20,150,150,3)]与二进制标签[形状为(20,)]组成的批量。每个批量中包含20个样本(批量大小)。注意,生成器会不停地生成这些批量,它会不断循环目标文件夹中的图像。因此,你需要在某个时刻终止(break)迭代循环。
>>> for data_batch,labels_batch in train_generator: >>> print('data batch shape:',data_batch.shape) >>> print('labels batch shape:',labels_batch.shape) >>> break data batch shape: (20,150,150,3) labels batch shape: (20,)利用生成器,我们让模型对数据进行拟合。我们将使用fit_generator方法来拟合,它在数据生成器上的效果和fit相同。它的第一个参数应该是一个Python生成器,可以不停地生成输入和目标组成的批量,比如train_generator。因为数据是不断生成的,多以Keras模型要知道每一轮需要从生成器中抽取多少个样本。这是steps_per_epoch参数的作用:从生成器中抽取steps_per_epoch个批量后(即运行了steps_per_epoch次梯度下降),拟合过程将进入下一个批次。 本例中,每个批量包含20个样本,所以读取完所有2000个样本需要100个批量。
使用fit_generator时,你可以传入一个validation_data参数,其作用和在fit方法中类似。值得注意的是,这个参数可以是一个数据生成器,但也可以是Numpy数组组成的元组。如果向validation_data传入一个生成器,那么这个生成器应该能够能够不停地生成验证数据批量,因此你还需要指定validation_steps参数,说明需要从验证生成器中抽取多少个批次用于评估。
history = model.fit_generator( train_generator, steps_per_epoch=100, epochs=30, validation_data=validation_generator, validation_steps=50)