Keras中文文档:图像预处理ImageDataGenerator 类详细学习记录

写在前面的话

  1. 受教于学长,Keras的探究还需进行
  2. 要把Keras用得熟练并非那么容易

1.ImageDataGenerator 类

参考文献:https://keras.io/zh/preprocessing/image/

1.1使用datagen.flow()

import keras.datasets.cifar10 as cifar10 # 这里源码中没有写,我自己加上了
(x_train, y_train), (x_test, y_test) = cifar10.load_data() # 加载cifar10数
# 将标签全部转换为one—hot类型的
y_train = np_utils.to_categorical(y_train, num_classes)
y_test = np_utils.to_categorical(y_test, num_classes)
# ImageDataGenerator中的输入参数是dict类型的
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) # x_train为4维张量

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

# 这里有一个更 「手动」的例子
for e in range(epochs):
    print('Epoch', e)
    batches = 0
    # 一次读了32个训练数据进来
    for x_batch, y_batch in datagen.flow(x_train, y_train, batch_size=32):
        model.fit(x_batch, y_batch)  # 训练
        batches += 1
        if batches >= len(x_train) / 32:
            # 我们需要手动打破循环,
            # 因为生成器会无限循环
            break

1.2使用train_datagen.flow_from_directory()

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1./255)
# flow_from_directory()第一个参数是数据所在目录,且在这个目录下包含多个独立的子文件夹,每个文件夹下面放着同种类别的数据,这些独立的子文件夹将自动视为不同的类别,也就省去了做标签的过程了
# 其中的binary指的是二分类问题,categorical指one-hot多分类,sparse指整数多分类,input用于自编码
train_generator = train_datagen.flow_from_directory(
        'data/train',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
        'data/validation',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

model.fit_generator(
        train_generator,
        steps_per_epoch=2000,
        epochs=50,
        validation_data=validation_generator,
        validation_steps=800)

1.3同时对image和mask做数据增强

# 创建两个相同参数的实例
# data_gen_args 是一个字典变量
data_gen_args = dict(featurewise_center=True,
                     featurewise_std_normalization=True,
                     rotation_range=90,
                     width_shift_range=0.1,
                     height_shift_range=0.1,
                     zoom_range=0.2)
# 这里用到的**data_gen_args其实就是定义了一种dict传入函数的方式         
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)

# 为 fit 和 flow 函数提供相同的种子和关键字参数
seed = 1
image_datagen.fit(images, augment=True, seed=seed)
mask_datagen.fit(masks, augment=True, seed=seed)

image_generator = image_datagen.flow_from_directory(
    'data/images',
    class_mode=None,  # None的作用是只返回数据增强后的数据,而不生成标签,这对model.predict_generator(), model.evaluate_generator()是很有用的
    seed=seed)

mask_generator = mask_datagen.flow_from_directory(
    'data/masks',
    class_mode=None,
    seed=seed)

# 将生成器组合成一个产生图像和蒙版(mask)的生成器
train_generator = zip(image_generator, mask_generator)

# fit_generator可以完成咋cpu上进行实时数据增强,然后同时使用GPU进行模型的训练
model.fit_generator(
    train_generator,
    steps_per_epoch=2000,
    epochs=50)

补:

2.dict变量给keras中的ImageDataGenerator()赋值
from keras.preprocessing.image import ImageDataGenerator
data_gen_args = dict(rotation_range=90) #等效于以下的表达方式:{'rotation_range':90}
image_datagen = ImageDataGenerator(**data_gen_args) # 这里加不加**都可以

本人现在的研究方向是:
图像的语义分割,如果有志同道合的朋友,可以组队学习
[email protected] qq:1355365561

你可能感兴趣的:(deep,learning)