Home 卷积神经网络初探 — 鼠头与鸭脖 AI 分类器
Post
Cancel

卷积神经网络初探 — 鼠头与鸭脖 AI 分类器

在这篇文章中,我将介绍一个基于卷积神经网络(Convolutional Neural Network,CNN)的人工智能实战项目,该项目可以对图像中的鼠头和鸭脖进行分类识别。我将探讨数据处理、模型构建、训练过程以及最终应用的实现。通过这个项目,我将了解如何利用深度学习技术解决实际问题。

人工智能的运作原理

人工智能的运作原理是基于机器学习和深度学习技术。它的基本流程如下:

  • 数据收集:人工智能需要大量的数据来进行学习和训练。这些数据可以是结构化的数据,如数据库中的表格数据,也可以是非结构化的数据,如图像、声音和文本等。

  • 数据预处理:在进行训练之前,需要对数据进行预处理,包括数据清洗、去噪、归一化等操作,以确保数据的质量和一致性。

  • 特征提取:在机器学习中,特征提取是将原始数据转化为能够被算法有效处理的特征向量的过程。这些特征向量应该能够准确地刻画数据的特点和属性。

  • 模型选择与训练:选择合适的机器学习算法和模型架构,并使用预处理后的数据进行训练。训练过程中,模型会根据输入数据逐步调整自身的参数,以提高对数据的预测准确度。

  • 模型评估与优化:通过与标注好的测试数据进行对比,评估模型的性能。如果性能不够理想,可以通过调整模型参数、增加训练数据量等方法进行优化。

  • 模型应用:经过训练和优化的模型可以用于实际应用中。它可以根据输入数据进行预测、分类、聚类等任务,并输出相应的结果。

卷积神经网络(CNN)

卷积神经网络(Convolutional Neural Network,CNN)是一种深度学习模型,专门用于处理和分析具有网格结构数据的任务,例如图像和声音等。

卷积神经网络的主要特点是通过使用卷积层和池化层等特殊层来自动提取和学习数据中的特征。它的运作原理如下:

  • 卷积层(Convolutional Layer):卷积层是卷积神经网络的核心组成部分。它使用卷积操作来提取图像中的局部特征。卷积操作是指将一个滤波器(也称为卷积核)应用于输入图像的不同位置,通过计算滤波器与输入之间的卷积运算来生成特征图。每个滤波器可以识别不同的特征,例如边缘、纹理等。

  • 激活函数(Activation Function):对于卷积层的输出,通常会应用激活函数来引入非线性,以增加模型的表征能力。常用的激活函数包括 ReLU、Sigmoid 和 tanh 等。

  • 池化层(Pooling Layer):池化层用于减小特征图的空间尺寸,并减少参数数量。常用的池化操作是将一个固定大小的滑动窗口应用于特征图,并根据滑动窗口内值的汇总统计结果(例如最大值或平均值)来生成新的特征图。池化操作有助于保留图像的重要特征,并具有平移不变性。

  • 全连接层(Fully Connected Layer):在经过多个卷积层和池化层之后,卷积神经网络一般会包含一个或多个全连接层。全连接层将前一层的所有输出神经元与当前层的所有神经元进行连接,并通过学习权重来建立输入和输出之间的关系。全连接层主要用于将高级特征映射到最终输出的类别或标签。

  • 损失函数(Loss Function):在训练过程中,卷积神经网络通过与真实标签进行比较,使用损失函数来计算预测结果与真实结果之间的误差。常用的损失函数包括交叉熵、均方差等。目标是最小化损失函数,从而提高模型的预测准确度。

  • 反向传播(Backpropagation):在完成前向传播(通过网络从输入到输出)和计算损失函数之后,反向传播算法用于沿网络中的每一层计算梯度。梯度表示损失函数相对于网络参数的变化率,通过反向传播算法,可以将误差从输出层逐层向后传播,从而更新每层的权重和偏置。

  • 参数优化:通过梯度下降算法或其变种,根据反向传播计算得到的梯度信息,更新网络中的参数(权重和偏置),以使损失函数不断减小。常见的优化算法包括随机梯度下降(SGD)、动量法、Adam 等。

  • 训练和测试:训练阶段是通过将训练数据输入到卷积神经网络中,并通过反向传播和参数优化来提高模型的性能。训练过程会反复进行多个 epoch(迭代周期),每个 epoch 将训练数据划分为小批量(mini-batch)来进行梯度计算和参数更新。测试阶段是在训练结束后,使用测试数据评估已经训练好的模型的性能。测试数据应该是模型从未见过的数据,以确保模型的泛化能力。卷积神经网络的训练通常需要大量的标注数据和计算资源。在训练过程中,也可以采用一些技术来避免过拟合,例如数据增强、正则化和 dropout 等。

卷积神经网络在图像识别、目标检测、语音识别等领域取得了很大的成功,并成为深度学习的重要应用之一。它的优势在于可以自动学习图像或声音等数据中的特征,减少了人为提取特征的工作量,并且在处理大规模数据和复杂任务时具有很好的表现能力。

实战部分

数据收集与预处理

项目中,我从 Google 搜集了一些鼠头和鸭脖图像作为数据集,数据集分为训练数据和测试数据,目录结构如图所示:

Image

Image

Image

紧接着,需要加载图像数据并进行预处理。在代码中,我使用了 OpenCV 库来加载图像。fit.py中的以下代码片段展示了这一过程:

1
2
3
4
5
6
7
8
9
10
11
# 遍历数据集文件夹
for label in labels:
    folder_path = os.path.join(dataset_path, label)
    for image_file in os.listdir(folder_path):
        image_path = os.path.join(folder_path, image_file)
        image = cv2.imread(image_path)
        if image is not None:
            image = cv2.resize(image, (64, 64))  # 调整图像大小为64x64
            image = image.astype('float32') / 255.0  # 归一化像素值到0-1之间
            data.append(image)
            target.append(labels[label])

这段代码遍历数据集文件夹,将每个图像加载、调整大小,并将像素值归一化。这些处理步骤有助于模型更好地学习图像特征。

模型构建与训练

我的模型使用了一系列卷积层、池化层和全连接层。这些层一起构成了一个图像分类器。以下是模型构建和训练的代码片段:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
####  模型构建
model = tf.keras.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(64, 64, 3)),
    layers.MaxPooling2D((2, 2)),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(2, activation='softmax')
])

####  编译模型
model.compile(optimizer='adam',
              loss=tf.keras.losses.SparseCategoricalCrossentropy(
                  from_logits=True),
              metrics=['accuracy'])

### 训练模型
model.fit(X_train, y_train, epochs=10, validation_data=(X_test, y_test))

在这段代码中,我使用了一个简单的卷积神经网络架构,它在图像分类任务中表现良好。模型在训练数据上进行了 10 个周期的训练,同时在测试数据上进行了验证,以确保模型的泛化能力。

应用与预测

我还创建了一个图形界面应用,以便用户可以交互地使用我的模型。通过选择一张图像,应用会进行预测并显示结果。以下是应用代码的一部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class ImageClassifierApp(QMainWindow):
    # ...(略去其他部分)

    def open_image(self):
        file_path, _ = QFileDialog.getOpenFileName(
            self, "选择图片", "", "Image Files (*.jpg *.jpeg *.png *.bmp)")
        if file_path:
            image = cv2.imread(file_path)
            image = cv2.resize(image, (64, 64))
            image = image.astype('float32') / 255.0
            input_image = np.expand_dims(image, axis=0)

            predictions = loaded_model.predict(input_image)
            predicted_class = np.argmax(predictions[0])
            class_labels = {0: 'mouse', 1: 'duck'}
            predicted_label = class_labels[predicted_class]

            pixmap = QPixmap(file_path)
            self.label_image.setPixmap(pixmap.scaled(300, 200))
            self.label_prediction.setText(
                "预测结果: " + ('鼠头' if predicted_label == 'mouse' else '鸭脖'))

这段代码中,我加载了模型并将用户选择的图像进行了预处理,然后使用模型进行预测并在界面上显示结果。

效果如图所示: Image Image

最后

该项目,从数据准备、模型构建到应用界面都进行了实际操作。能够帮助我更好地理解人工智能技术和卷积神经网络的运作原理,了解人工智能在图像分类任务中的应用。

参考

This post is licensed under CC BY 4.0 by the author.

深入理解计算复杂度(中)

-