如何使用Tensorflow标准化flower数据集?
在Tensorflow中,flower数据集是一个著名的图像分类挑战。它由5个不同的类别组成,每个类别都有80张大小为256×256的JPEG图像。这些图像涵盖了5个类别:雏菊(daisy)、向日葵(sunflowers)、罂粟花(poppies)、蒲公英(dandelion)和郁金香(tulips)。
本文将介绍如何使用Tensorflow标准化flower数据集。我们将从下载flower数据集开始,在Tensorflow中读取数据集以及对flower数据集做标准化处理。
阅读更多:Python 教程
下载flower数据集
我们首先需要从http://www.robots.ox.ac.uk/~vgg/data/flowers/102/上下载flower数据集。下载完成后,你应该有一个名为“flower_photos”的文件夹,里面包含五个子文件夹,每个文件夹包含一个类别的图片。
在Tensorflow中读取flower数据集
我们将会使用Tensorflow的tf.keras.preprocessing.image.ImageDataGenerator模块读取flower数据集。ImageDataGenerator是用于实时数据增强的生成器,它接收numpy数组和多个参数来生成经过增强的图像返回。这节将展示如何设置ImageDataGenerator来读取flower数据集,并将数据集划分为训练集和验证集。
import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 设置ImageDataGenerator来处理flower数据集,并将数据集划分为训练集和验证集
train_datagen = ImageDataGenerator(rescale=1./255, validation_split=0.2)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
'flower_photos',
target_size=(256, 256),
batch_size=32,
class_mode='categorical',
subset='training')
validation_generator = train_datagen.flow_from_directory(
'flower_photos',
target_size=(256, 256),
batch_size=32,
class_mode='categorical',
subset='validation')
在上述代码中,我们使用train_datagen的validation_split参数将数据集划分为训练集和验证集。预处理ImageDataGenerator的rescale参数可以将图像像素值的范围缩放到0到1之间。在此之后,我们将使用.flow_from_directory()方法来读取数据集,并配置其类别和数据形状。
标准化flower数据集
标准化是处理和清理数据的重要步骤。我们将使用ImageDataGenerator的特性来轻松地预处理数据集。具体地,我们将使用.flow()方法来对flower数据集进行标准化。
X_train, y_train = train_generator.next()
X_val, y_val = validation_generator.next()
print(f'shape of X_train: {X_train.shape}')
print(f'shape of X_val: {X_val.shape}')
运行输出后,可以看到X_train和X_val的形状为(32, 256, 256, 3)和(32, 256, 256, 3),分别对应着训练集和验证集的数据形状。其中,(32, 256, 256, 3)意味着数据集中每个样本都是一个大小为256×256,有3个通道的RGB图像。
使用.flow()方法的一个重要用途是在内存中展开数据集。这可以减少硬盘操作,提高数据的读取速度。接下来,我们将标准化train_generator和validation_generator,并将其保存在numpy数组中。
# 标准化train_generator和validation_generator,保存在numpy数组中
mean_train = X_train.mean(axis=(0,1,2))
std_train = X_train.std(axis=(0,1,2))
X_train_standardized = (X_train - mean_train) / std_train
X_val_standardized = (X_val - mean_train) / std_train
在上述代码中,我们计算了X_train的均值和标准差,并使用它们来对训练集和验证集进行标准化处理。这将标准化数据集,使得数据集的均值为0,标准差为1。我们可以使用该方法在输入数据中消除一些统计偏差,从而帮助模型更好地拟合数据。
构建模型并进行训练
在标准化完flower数据集后,我们可以使用Tensorflow的模型API来构建一个简单的卷积神经网络(CNN),并对其进行训练。下面是一个简单的CNN架构,其中包括两个卷积层,两个池化层和两个全连接层:
model = tf.keras.models.Sequential([
tf.keras.layers.Conv2D(16, (3,3), activation='relu', input_shape=(256, 256, 3)),
tf.keras.layers.MaxPooling2D(2, 2),
tf.keras.layers.Conv2D(32, (3,3), activation='relu'),
tf.keras.layers.MaxPooling2D(2,2),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(5, activation='softmax')
])
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
hist = model.fit(
train_generator,
epochs=10,
validation_data=validation_generator,
verbose=1)
在上述代码中,我们使用Sequential API来构建一个CNN模型。该模型的输入数据形状是(256, 256, 3),输出了一个长度为5的输出层。在模型的编译中,我们使用adam优化器和交叉熵损失函数。我们使用fit()方法通过train_generator和validation_generator来训练模型。
结论
在本文中,我们介绍了如何使用Tensorflow标准化flower数据集。我们使用了ImageDataGenerator模块来读取数据集,并使用.flow()方法预处理图片数据。我们还使用ImageDataGenerator的rescale参数将图像像素值缩放到0到1之间。同时,我们还构建了一个简单的CNN模型,并在标准化数据集之后对其进行了训练。这个模型在花卉分类任务上表现得非常好。