keras的ImageDataGenerator和flow()的用法说明

  • Post category:Python

下面是关于 Keras 的 ImageDataGenerator 和 flow() 方法使用的完整攻略。

什么是 Keras 的 ImageDataGenerator 和 flow() 方法?

Keras 是一个高层次的深度学习框架,ImageDataGenerator 是 Keras 提供的一个用于数据增强的工具类,主要用于对图像进行各种形式的增广,从而增加深度学习模型的泛化能力和鲁棒性。

flow() 方法是 ImageDataGenerator 的一个函数,用于生成训练数据和标签的生成器,可以在模型训练的时候直接从硬盘中生成批量的增广图像数据和对应的标签数据。

如何使用 ImageDataGenerator 和 flow() 方法?

1. 基本参数设置

ImageDataGenerator 的主要参数包括:

  • rotation_range:旋转角度范围,默认为 0。
  • width_shift_range:宽度偏移范围,默认为 0。
  • height_shift_range:高度偏移范围,默认为 0。
  • shear_range:剪切强度,默认为 0。
  • zoom_range:缩放范围,默认为 0。
  • horizontal_flip:是否进行水平翻转,默认为 False。
  • vertical_flip:是否进行垂直翻转,默认为 False。

具体使用方式如下:

from keras.preprocessing.image import ImageDataGenerator

# 创建 ImageDataGenerator 对象
augment_generator = ImageDataGenerator(
    rotation_range=30,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    vertical_flip=True,
)

2. 加载图像数据并进行增广

加载图像数据的方式取决于场景和应用。在这里,我们假设我们的图像数据存储在一个文件夹中,每个子文件夹代表一个类别。

from keras.preprocessing.image import ImageDataGenerator

# 指定图像数据的路径和一些基本参数
train_datagen = ImageDataGenerator(
    rotation_range=30,
    width_shift_range=0.2,
    height_shift_range=0.2,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True,
    vertical_flip=True,
    rescale=1 / 255.0,
    validation_split=0.2,
)

# 指定数据文件夹路径、target_size 和 batch_size
train_generator = train_datagen.flow_from_directory(
    "data/train",
    target_size=(64, 64),
    batch_size=32,
    class_mode="categorical",
    subset="training",
)
validation_generator = train_datagen.flow_from_directory(
    "data/train",
    target_size=(64, 64),
    batch_size=32,
    class_mode="categorical",
    subset="validation",
)

在上面的示例中,我们使用 flow_from_directory() 方法加载图像数据,并进行增广,同时将训练数据和验证数据分别放到不同的生成器中,以便于后续的训练和评估。

3. 模型训练

在将图像数据加载到生成器中之后,我们就可以直接将生成器传递给 Keras 的模型进行训练:

model.fit(
    train_generator,
    epochs=30,
    steps_per_epoch=2000,
    validation_data=validation_generator,
    validation_steps=800,
)

在上面的示例中,我们使用 fit() 方法训练模型,并指定了训练参数,包括 epochs、steps_per_epoch、validation_data 和 validation_steps 等参数。

示例

下面给出一个完整的代码示例,演示如何使用 ImageDataGenerator 和 flow() 方法对图像进行增广并进行模型训练。本示例使用的数据集是 MNIST,包含一些手写数字的灰度图像。

import numpy as np
from keras.datasets import mnist
from keras.preprocessing.image import ImageDataGenerator
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers import Conv2D, MaxPooling2D
from keras.optimizers import RMSprop

# 定义模型参数
batch_size = 128
num_classes = 10
epochs = 10

# 加载 MNIST 数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 将图像数据转换为 float 型,并进行归一化
x_train = x_train.astype("float32")
x_test = x_test.astype("float32")
x_train /= 255
x_test /= 255

# 对图像进行增广
data_generator = ImageDataGenerator(
    rotation_range=10,
    width_shift_range=0.1,
    height_shift_range=0.1,
    zoom_range=0.1,
)

# 初始化模型
model = Sequential()

# 添加卷积层和池化层
model.add(Conv2D(32, kernel_size=(5, 5), activation="relu", input_shape=(28, 28, 1)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Conv2D(64, kernel_size=(5, 5), activation="relu"))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten())

# 添加全连接层和 Dropout 层
model.add(Dense(1024, activation="relu"))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation="softmax"))

# 编译模型
model.compile(loss="categorical_crossentropy", optimizer=RMSprop(), metrics=["accuracy"])

# 使用生成器训练模型
train_generator = data_generator.flow(
    x_train.reshape(-1, 28, 28, 1), y_train,
    batch_size=batch_size,
)
model.fit(
    train_generator,
    steps_per_epoch=len(x_train) // batch_size,
    epochs=epochs,
    validation_data=(x_test.reshape(-1, 28, 28, 1), y_test),
)

在上面的示例中,我们使用 MNIST 数据集对模型进行训练。我们首先对图像进行了归一化,然后使用 ImageDataGenerator 进行增广,接着使用 flow() 方法将增广后的数据放到一个生成器中,最后使用 fit() 方法对模型进行训练。模型使用了两个卷积层和两个全连接层,以及一些 Dropout 层,以增加模型的泛化能力。