ImageDataGenerator是Keras中用于图像预处理的一个方法,当我们的数据集较小时,使用这个方法可以增加我们的数据,因而使训练的结果更加准确。

这个方法当中的一些参数我一直是很蒙的状态,不知道预设这些参数后对数据产生何种影响。因此想借助官方的中文文档,加深我对这些数据的理解。老规矩,这里附上官方文档的超链接,点击图像预处理ImageDataGenerator查看。

方法的引入

首先在使用这个方法之前,应该学习如何在代码中引入,方法如下:

1
2
import Keras
from keras.processing.image import ImageDataGenerator

参数

在引入ImageDataGenerator方法之后,接下来我们来看一下,其中的方法中的参数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
keras.preprocessing.image.ImageDataGenerator(featurewise_center=False,  
samplewise_center=False,
featurewise_std_normalization=False,
samplewise_std_normalization=False,
zca_whitening=False,
zca_epsilon=1e-06,
rotation_range=0,
width_shift_range=0.0,
height_shift_range=0.0,
brightness_range=None,
shear_range=0.0,
zoom_range=0.0,
channel_shift_range=0.0,
fill_mode='nearest',
cval=0.0,
horizontal_flip=False,
vertical_flip=False,
rescale=None,
preprocessing_function=None,
data_format=None,
validation_split=0.0,
dtype=None)

这个方法的参数,说实话真的很多,也侧面说明该方法的强大,下面我们挑几个常用的参数来进行解释,解释这些参数的作用与如何设置。

  • featurewise_center: 布尔值。将输入数据的均值设置为 0,逐特征进行。

  • samplewise_center: 布尔值。将每个样本的均值设置为 0。

  • featurewise_std_normalization: Boolean. 布尔值。将输入除以数据标准差,逐特征进行。

  • samplewise_std_normalization: 布尔值。将每个输入除以其标准差。

  • rotation_range: 整数。随机旋转的度数范围。

  • width_shift_range: 浮点数、一维数组或整数

    • float: 如果 <1,则是除以总宽度的值,或者如果 >=1,则为像素值。
    • 1-D 数组: 数组中的随机元素。
    • int: 来自间隔 (-width_shift_range, +width_shift_range) 之间的整数个像素。
    • width_shift_range=2 时,可能值是整数 [-1, 0, +1],与 width_shift_range=[-1, 0, +1] 相同;而 width_shift_range=1.0 时,可能值是 [-1.0, +1.0) 之间的浮点数。
  • height_shift_range: 浮点数、一维数组或整数

    • float: 如果 <1,则是除以总宽度的值,或者如果 >=1,则为像素值。
    • 1-D array-like: 数组中的随机元素。
    • int: 来自间隔 (-height_shift_range, +height_shift_range) 之间的整数个像素。
    • height_shift_range=2 时,可能值是整数 [-1, 0, +1],与 height_shift_range=[-1, 0, +1] 相同;而 height_shift_range=1.0 时,可能值是 [-1.0, +1.0) 之间的浮点数。
  • shear_range: 浮点数。剪切强度(以弧度逆时针方向剪切角度)。

  • zoom_range: 浮点数 或 [lower, upper]。随机缩放范围。如果是浮点数,[lower, upper] = [1-zoom_range, 1+zoom_range]

  • horizontal_flip: 布尔值。随机水平翻转。

  • vertical_flip: 布尔值。随机垂直翻转。

  • rescale: 重缩放因子。默认为 None。如果是 None 或 0,不进行缩放,否则将数据乘以所提供的值(在应用任何其他转换之前)。

  • preprocessing_function: 应用于每个输入的函数。这个函数会在任何其他改变之前运行。这个函数需要一个参数:一张图像(秩为 3 的 Numpy 张量),并且应该输出一个同尺寸的 Numpy 张量。

  • validation_split: 浮点数。Float. 保留用于验证的图像的比例(严格在0和1之间)。

  • dtype: 生成数组使用的数据类型。

例子

使用.flow(x, y)的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(x_train, y_train), (x_test, y_test) = cifar10.load_data()
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)

datagen = ImageDataGenerator(
featurewise_center=True,
featurewise_std_normalization=True,
rotation_range=20,
width_shift_range=0.2,
height_shift_range=0.2,
horizontal_flip=True)

# 计算特征归一化所需的数量
# (如果应用 ZCA 白化,将计算标准差,均值,主成分)
datagen.fit(x_train)

## 使用实时数据增益的批数据对模型进行拟合:
model.fit_generator(datagen.flow(x_train, y_train, batch_size=32),steps_per_epoch=len(x_train) / 32, epochs=epochs)

flow

1
flow(x, y=None, batch_size=32, shuffle=True, sample_weight=None, seed=None, save_to_dir=None, save_format='png', subset=None)

采集数据和标签数组,生成批量增强数据。

参数

  • x: 输入数据。秩为 4 的 Numpy 矩阵或元组。如果是元组,第一个元素应该包含图像,第二个元素是另一个 Numpy 数组或一列 Numpy 数组,它们不经过任何修改就传递给输出。可用于将模型杂项数据与图像一起输入。对于灰度数据,图像数组的通道轴的值应该为 1,而对于 RGB 数据,其值应该为 3。
  • y: 标签。
  • batch_size: 整数 (默认为 32)。
  • shuffle: 布尔值 (默认为 True)。
  • sample_weight: 样本权重。
  • seed: 整数(默认为 None)。
  • save_to_dir: None 或 字符串(默认为 None)。这使您可以选择指定要保存的正在生成的增强图片的目录(用于可视化您正在执行的操作)。
  • save_prefix: 字符串(默认 '')。保存图片的文件名前缀(仅当 save_to_dir 设置时可用)。
  • save_format: “png”, “jpeg” 之一(仅当 save_to_dir 设置时可用)。默认:“png”。
  • subset: 数据子集 (“training” 或 “validation”),如果 在 ImageDataGenerator 中设置了 validation_split

返回

一个生成元组 (x, y)Iterator,其中 x 是图像数据的 Numpy 数组(在单张图像输入时),或 Numpy 数组列表(在额外多个输入时),y 是对应的标签的 Numpy 数组。如果 ‘sample_weight’ 不是 None,生成的元组形式为 (x, y, sample_weight)。如果 y 是 None, 只有 Numpy 数组 x 被返回。


ImageDataGenerator方法功能很强大,这里就列出几个比较常用的,如果在实际应用中有包含没涉及到的,可以直接查看官方文档

这里再附上一个CSDN上一位博主写的更加直观的解释,方便加深印象,附上链接可以直接点击查看。