ImageDataGenerator()是keras.preprocessing.image模块中的图片生成器,同时也可以在batch中进行数据增强。
例:可以自动为训练数据生成标签。下图中训练数据包含两个文件夹,使用ImageDataGenerator可以自动将horses里面的图片的标签自动设置为horses类标签,将humans里面的图片的标签自动设置为humans的标签。
1.创建对象:datagen=keras.preprocessing.image.ImageDataGenerator(参数)
datagen= 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.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)
参数:
import os
import zipfile
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
############################################构建模型############################################################################
model=tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16,(3,3),activation=tf.nn.relu,input_shape=(300,300,3)),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(32,(3,3),activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64,(3,3),activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64,(3,3),activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Conv2D(64, (3, 3), activation=tf.nn.relu),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(512,activation=tf.nn.relu),
tf.keras.layers.Dense(1,activation=tf.nn.sigmoid)
])
model.summary()#模型可视化
# Model: "sequential"
# _________________________________________________________________
# Layer (type) Output Shape Param #
# =================================================================
# conv2d (Conv2D) (None, 298, 298, 16) 448
# _________________________________________________________________
# max_pooling2d (MaxPooling2D) (None, 149, 149, 16) 0
# _________________________________________________________________
# conv2d_1 (Conv2D) (None, 147, 147, 32) 4640
# _________________________________________________________________
# max_pooling2d_1 (MaxPooling2 (None, 73, 73, 32) 0
# _________________________________________________________________
# conv2d_2 (Conv2D) (None, 71, 71, 64) 18496
# _________________________________________________________________
# max_pooling2d_2 (MaxPooling2 (None, 35, 35, 64) 0
# _________________________________________________________________
# conv2d_3 (Conv2D) (None, 33, 33, 64) 36928
# _________________________________________________________________
# max_pooling2d_3 (MaxPooling2 (None, 16, 16, 64) 0
# _________________________________________________________________
# conv2d_4 (Conv2D) (None, 14, 14, 64) 36928
# _________________________________________________________________
# max_pooling2d_4 (MaxPooling2 (None, 7, 7, 64) 0
# _________________________________________________________________
# flatten (Flatten) (None, 3136) 0
# _________________________________________________________________
# dense (Dense) (None, 512) 1606144
# _________________________________________________________________
# dense_1 (Dense) (None, 1) 513
# =================================================================
# Total params: 1,704,097
# Trainable params: 1,704,097
# Non-trainable params: 0
# _________________________________________________________________
############################################编译模型############################################################################
model.compile(opitimizer=tf.keras.optimizers.RMSprop(lr=0.001),loss=tf.keras.losses.binary_crossentropy)
############################################使用图像生成器生成带标签的数据数据###################################################
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen=ImageDataGenerator(rescale=1/255)#创建一个对象,并将图片的大小规范到0-1之间
# 生成训练集的带标签的数据
train_generator=train_datagen.flow_from_directory(
'数据集\horse-or-man',#数据路径
target_size=(300,300),
class_mode='binary'
)
############################################训练模型#############################################################################
history=model.fit_generator(
train_generator,
steps_per_epoch=8,
epochs=15,
verbose=1
)