从零开始用 Python 训练卷积神经网络进行花卉识别
2023-09-29 04:47:15
用 CNN 创建花卉识别分类器:从零开始的深入指南
简介
在数字时代,图像识别已成为人工智能领域的一个核心部分,在从医疗保健到安保再到自动驾驶的各个领域都发挥着至关重要的作用。其中,花卉识别是一个令人着迷的应用,它可以让我们只需用智能手机拍摄一张照片,就能立即识别出花的类型和特征。本教程将带你逐步了解如何使用卷积神经网络(CNN)从头开始训练一个花卉识别分类器。
了解 CNN
卷积神经网络是一种深度学习算法,专为处理图像数据而设计。CNN 由多个卷积层组成,每个卷积层使用一系列滤波器来提取图像中的特征。然后将这些特征输入全连接层,这些层负责将提取的特征分类为特定的类别。
获取数据集
要训练花卉识别分类器,我们需要一个包含大量标注花卉图像的数据集。对于本教程,我们将使用由花卉识别挑战赛提供的 Flickr 花卉数据集。这个数据集包含超过 8000 张来自 102 个不同类别的花卉图像。
预处理图像
在训练 CNN 之前,需要对图像进行预处理。这包括调整图像大小、标准化像素值以及将其转换为 TensorFlow 接受的格式。下面是一个 Python 代码示例,演示了如何预处理图像:
def preprocess_image(image):
# 调整图像大小
image = tf.image.resize(image, [224, 224])
# 标准化像素值
image = tf.image.per_image_standardization(image)
# 转换为 TensorFlow 格式
image = tf.expand_dims(image, axis=0)
return image
创建 CNN 模型
现在,我们可以创建 CNN 模型。我们将使用一个简单的 CNN 架构,包括两个卷积层和两个全连接层。以下是使用 TensorFlow Keras 创建模型的代码:
# 创建输入层
inputs = tf.keras.Input(shape=(224, 224, 3))
# 添加卷积层 1
x = tf.keras.layers.Conv2D(32, (3, 3), activation='relu')(inputs)
x = tf.keras.layers.MaxPool2D((2, 2))(x)
# 添加卷积层 2
x = tf.keras.layers.Conv2D(64, (3, 3), activation='relu')(x)
x = tf.keras.layers.MaxPool2D((2, 2))(x)
# 展平特征
x = tf.keras.layers.Flatten()(x)
# 添加全连接层 1
x = tf.keras.layers.Dense(128, activation='relu')(x)
# 添加全连接层 2
outputs = tf.keras.layers.Dense(102, activation='softmax')(x)
# 创建模型
model = tf.keras.Model(inputs=inputs, outputs=outputs)
编译模型
在编译模型之前,我们需要指定损失函数和优化器。对于本教程,我们将使用交叉熵作为损失函数,并使用 Adam 优化器。以下是编译模型的代码:
model.compile(optimizer='adam', loss='sparse_categorial_crossentropy', metrics=['accuracy'])
训练模型
现在,我们可以训练模型了。我们将使用 Flickr 花卉数据集中的 80% 图像进行训练,并将剩下的 20% 用作验证数据。以下是训练模型的代码:
# 获取训练和验证数据
(train_data, train_labels), (test_data, test_labels) = tf.keras.datasets.flowers.load_data()
# 预处理训练和验证数据
train_data = np.array([preprocess_image(image) for image in train_data])
test_data = np.array([preprocess_image(image) for image in test_data])
# 训练模型
model.fit(train_data, train_labels, epochs=10, validation_data=(test_data, test_labels))
评估模型
训练完成后,我们可以评估模型在验证数据上的性能。以下是评估模型的代码:
# 评估模型
test_loss, test_accuracy = model.evaluate(test_data, test_labels, verbose=2)
# 打印评估结果
print('\nTest loss:', test_loss)
print('\nTest accuracy:', test_accuracy)
预测花卉
训练并评估模型后,我们可以使用它来预测新图像中的花卉类型。以下是使用训练后的模型预测花卉类型