Keras中的图片生成器类ImageDataGenerator

tf.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,可替代图像归一化。具体来说,假设原数据集图像是x,当Featurewise_center和Samplewise_center连个参数设置为True时,以x为基础生成新数据时,每个图像都要先执行Xi = Xi - mean 其中mean是数据集图像的均值。数据集里有多个图像,均值mean可以有两种方法获得。当samplewise_center=True时,mean是每个图像的所有像素值的均值。这样生成的每一个图像的均值应该接近于0。当featurewise_center=True时,mean是所有图像的像素的均值。如果数据集里的图像有多个颜色通道,那么,ImageDataGenerator会为每个颜色通道计算一个均值,各个通道独立计算 Xi = Xi - mean 。 所以:如果想要在进行数据增强时还达到归一化的效果,就不要把featurewise_center和samplewise_center这两个参数都设置成True。

Samplewise_

center

Featurewise_std_

normalization

布尔值,将输入除以数据集的标准差以完成标准化

Samplewise_std_

normalization

布尔值,将输入的每个样本除以其自身的标准差。

Zca_whiteng

zca白化的作用是针对图片进行PCA降维操作,减少图片的冗余信息,保留最重要的特征。

Zca_epsilon

zca白化参数的ε值,默认值是1e-6。

Ratation_range

角度随机旋转的范围,只需指定一个整数即可,在[0,指定角度]范围内的角度值,随机旋转图片。

Width_shift_

range

水平方向位置随机左右平移,其参数值可以是[0,1]之间的浮点数,表示原始图片中的信息无论怎么左右平移都有部分原始信息在变换后的图片中。但参数也可以大于1,此时图片平移距离为:图片尺寸的宽乘以这个参数。在变换后的图像中可能表示为全部信息是原始图像左右边界的像素信息。

Height_shift_

range

竖直方向位置随机上下平移,其参数值可以是[0,1]之间的浮点数,表示原始图片中的信息无论怎么上下平移都有部分原始信息在变换后的图片中。但参数也可以大于1,此时图片平移距离为:图片尺寸的高乘以这个参数。在变换后的图像中可能表示为全部信息是原始图像上下边界的像素信息。

Brightness_range

图像随机亮度增强,给定一个含两个float值的list或一个元组,亮度值取自上下限值间。

Share_range

随机错切变换,效果就是让所有点的x坐标(或者y坐标)保持不变,而对应的y坐标(或者x坐标)则按比例发生平移,且平移的大小和该点到x轴(或y轴)的垂直距离成正比。值表示,在逆时针方向上新图和原图之间的错切角度,单位是度。

Zoom_range

参数可以让图片在长或宽的方向随机进行放大,可以理解为某方向的resize,因此这个参数可以是一个数或者是一个list。当给出一个数时,图片同时在长宽两个方向进行同等程度的放缩操作;当给出一个list时,则代表[width_zoom_range, height_zoom_range],即分别对长宽进行不同程度的放缩。而参数大于0小于1时,执行的是放大操作,当参数大于1时,执行的是缩小操作。

Channel_shift_

range

可以理解成随机改变图片的颜色,通过对颜色通道的数值偏移,改变图片的整体的颜色,这意味着是“整张图”呈现某一种颜色,像是加了一块有色玻璃在图片前面一样,因此它并不能单独改变图片某一元素的颜色,如黑色小狗不能变成白色小狗。当数值越大时,颜色变深的效果越强。

Fill_mode

填充模式,默认为最近原则,比如一张图片向右平移,那么最左侧部分会被临近的图案覆盖共4中模式,即:"constant", "nearest", "reflect" or "wrap"。四种填充形式如下:

'constant': kkkkkkkk|abcd|kkkkkkkk (cval=k)

'nearest': aaaaaaaa|abcd|dddddddd

'reflect': abcddcba|abcd|dcbaabcd

'wrap': abcdabcd|abcd|abcdabcd

cval

填充值,整型或浮点型。只有当fill_mode是constant时,才有效。

Horizontal_flip

随机对图片执行水平方向翻转操作,意味着不一定对所有图片都会执行水平翻转,每次生成均是随机选取图片进行翻转。

Vertical_flip

随机对图片执行竖直方向翻转操作,意味着不一定对所有图片都会执行竖直翻转,每次生成均是随机选取图片进行翻转。

rescale

对图片的每个像素值均乘上这个放缩因子,这个操作在所有其它变换操作之后执行,在一些模型当中,直接输入原图的像素值可能会落入激活函数的“死亡区”,因此设置放缩因子为1/255,把像素值放缩到0和1之间有利于模型的收敛,避免神经元“死亡”。

Preprocessing_

function

图片预处理,此功能对每一张输入图片都有效,在图像resize或增强执行后立即执行。如取值为random_crop_image,则对输入图像进行随机裁剪,裁剪后的图片和裁剪前图片的shape保持一致。

Data_format

图像数据的格式,有“channels_last”和“channels_first”两种形式,即分别对应图像数据的(samples, height, width, channels) 和(samples, channels, height, width)两种格式。默认是“channels_last”。

Validation_split

[0,1]之间的浮点型数据,分隔多少图像数据用于训练过程中的保留验证。

dtype

生成数据的数据类型,有‘float32’,‘float64’等。

举例说明:

使用.flow(x,y):

import tensorflow as tf
from tensorflow.keras import utils
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, 	MaxPool2D, Dropout, Flatten, Dense
from tensorflow.keras import Model

cifar10 = tf.keras.datasets.cifar10

# 定义分类别数和数据迭代轮次
num_classes = 10
epochs = 5

(x_train, y_train), (x_test, y_test) = cifar10.load_data()
y_train = utils.to_categorical(y_train, num_classes)
y_test = 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,
    			             validation_split=0.2)
# compute quantities required for featurewise normalization
# (std, mean, and principal components if ZCA whitening is applied)
datagen.fit(x_train)


class Baseline(Model):
    def __init__(self):
        super(Baseline, self).__init__()
        self.c1 = Conv2D(filters=6, kernel_size=(5, 5), padding='same')  # 卷积层
        self.b1 = BatchNormalization()  # BN层
        self.a1 = Activation('relu')  # 激活层
        self.p1 = MaxPool2D(pool_size=(2, 2), strides=2, padding='same')  # 池化层
        self.d1 = Dropout(0.2)  # dropout层

        self.flatten = Flatten()
        self.f1 = Dense(128, activation='relu')
        self.d2 = Dropout(0.2)
        self.f2 = Dense(10, activation='softmax')

    def call(self, x):
        x = self.c1(x)
        x = self.b1(x)
        x = self.a1(x)
        x = self.p1(x)
        x = self.d1(x)

        x = self.flatten(x)
        x = self.f1(x)
        x = self.d2(x)
        y = self.f2(x)
        return y


model = Baseline()
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(
                                                  from_logits=False),
                                                  metrics=['sparse_categorical_accuracy']
)

# 训练模型
model.fit(datagen.flow(x_train, y_train, batch_size=32, subset='training'),
          validation_data=datagen.flow(x_train, y_train, batch_size=8, 
		  subset='validation'),
          steps_per_epoch=len(x_train) / 32, epochs=epochs)

# here's a more "manual" example
for e in range(epochs):
    print('Epoch', e)
    batches = 0
    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:
            # we need to break the loop by hand because
            # the generator loops indefinitely
            break

使用.flow_from_directory(directory):

train_datagen = ImageDataGenerator(
                                    rescale=1. / 255,
                                    shear_range=0.2,
                                    zoom_range=0.2,
                                    horizontal_flip=True)
test_datagen = ImageDataGenerator(rescale=1. / 255)
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(
            train_generator,
            steps_per_epoch=2000,
            epochs=50,
            validation_data=validation_generator,
            validation_steps=800)

使用图像和掩膜一起转换:

# we create two instances with the same arguments
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)
image_datagen = ImageDataGenerator(**data_gen_args)
mask_datagen = ImageDataGenerator(**data_gen_args)
# Provide the same seed and keyword arguments to the fit and flow methods
seed = 1

image_generator = image_datagen.flow_from_directory(
                                                    'data/images',
                                                    class_mode=None,
                                                    seed=seed)
mask_generator = mask_datagen.flow_from_directory(
                                                  'data/masks',
                                                  class_mode=None,
                                                  seed=seed)
# combine generators into one which yields image and masks
train_generator = zip(image_generator, mask_generator)
model.fit(
          train_generator,
          steps_per_epoch=2000,
          epochs=50)

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ImageDataGeneratorKeras一个非常方便的图像数据生成器,主要用于数据增强(data augmentation)和实时数据扩充(real-time data augmentation)。它可以自动将一批原始图像转换为训练所需的随机数据,比如随机旋转、缩放、翻转等操作,从而扩大训练数据集,提高模型的泛化能力。 ImageDataGenerator可以通过定义不同的参数来实现各种图像增强的操作,例如: - rotation_range:旋转角度范围; - width_shift_range、height_shift_range:图像水平、垂直方向的平移范围; - shear_range:剪切强度; - zoom_range:随机缩放范围; - horizontal_flip、vertical_flip:是否随机水平、垂直翻转图像; - fill_mode:填充模式。 使用ImageDataGenerator时,需要先通过fit()方法计算出数据集的统计信息,然后可以通过flow()方法进行数据生成。例如: ```python from keras.preprocessing.image import ImageDataGenerator datagen = ImageDataGenerator( rotation_range=20, width_shift_range=0.2, height_shift_range=0.2, shear_range=0.2, zoom_range=0.2, horizontal_flip=True) datagen.fit(x_train) model.fit_generator(datagen.flow(x_train, y_train, batch_size=32), steps_per_epoch=len(x_train)/32, epochs=50) ``` 这段代码,我们先定义了一个ImageDataGenerator对象,然后定义了各种图像增强的参数。接着,我们通过fit()方法计算出数据集的统计信息,最后通过flow()方法生成扩充后的数据集,用于训练模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值