使用 CNN 进行图像分类2025年2月28日 | 阅读 6 分钟 本文主要介绍如何使用Python的TFLearn构建一个用于识别猫狗的图像分类器。 人工智能,或者说机器学习,是当今世界最受关注的话题之一。有人甚至称其为现代社会的“新电力”。但当我们谈论机器学习时,究竟意味着什么?换句话说,它是一种通过喂给机器大量数据来训练机器的方法。如果您需要更多关于机器学习及其算法的详细信息,欢迎查阅本文的参考文献部分。 今天的项目是创建一个图像分类器,它能够根据输入数据判断输入图片是狗、猫还是都不是。为此,我们将使用一种流行的机器学习方法——卷积神经网络(CNN)来进行图像分类。 什么是CNN?它实际上是一种机器学习算法,它教会机器如何分析给定图像中的特征,然后预测另一张图像的标签。由于本文并非详细介绍卷积神经网络,我将在文末提供一些额外的资源,供已经熟悉CNN基本定义的读者参考。 现在,让我们开始创建我们一直在谈论的猫狗图像分类器。我们将使用的数据集是从Kaggle上获取的,具体来说是猫狗数据集。 获取数据集后,还需要对数据进行预处理,并在训练模型时标记图像。在训练集图像的文件名中通常包含“cat”或“dog”,因此我们可以直接利用这些信息。然后,我们将对其进行独热编码,以便机器将其作为标签理解,例如:猫 [1, 0],狗 [0, 1]。 所需库 - TFLearn: 我们使用这个为TensorFlow开发的,面向高级API的深度学习库来构建CNN的层。
- tqdm: 为循环添加一个智能进度条,使其设计简洁美观。
- numpy: 用于处理数字图像矩阵。
- open-cv: 执行诸如将图像转换为灰度等功能。
- os: 允许与文件系统交互,即从训练和测试文件夹中读取图像。
- random: 打乱样本记录的顺序以消除偏差。
- matplotlib: 用于可视化预测结果。
- TensorFlow: 用于TensorBoard,当比较结果数据或日志的损失和Adam曲线时非常有用。
根据需要修改TRAIN_DIR和TEST_DIR,并调整基本的机器学习超参数,如epoch数量和学习率,以获得最大准确率。 代码片段 说明 - 导入所需库
首先,列出图像处理、数组处理、文件系统以及循环显示所需的模块。这些是用于加载、预处理和后处理图像的库。 - 设置环境
具体来说,环境设置包括训练和测试数据目录、图像大小和学习率的描述。这些是定义CNN模型以及保持图像尺寸和训练过程一致性的重要参数。 - 标记数据集
使用逻辑编程语言定义一个函数,该函数根据图像文件名来标记图像。例如,文件名中包含“cat”的图像被归类为[1, 0],而包含“dog”的图像被归类为[0, 1]。这种标记对于监督学习非常重要,因为要创建的模型需要一种方法来区分不同的类别。 - 创建训练数据
训练数据包括从训练目录加载图像,将图像转换为灰度格式以便于处理,将图像调整到所需尺寸,并使用上一节定义的标记函数对图像进行标记。然后对数据进行重新洗牌,以防止模型学习到数据顺序中可能存在的任何模式。 - 处理测试数据
与训练数据一样,测试数据也经过加载、调整大小和存储的处理。但是,测试数据集没有标记,用于评估模型在预测图像正确类别方面的性能。 - 构建CNN
CNN使用TFLearn实现,TFLearn是TensorFlow平台的一个高级API。该网络由多个卷积层和池化层组成,有助于从图像中提取特征。最后添加了其他层来进行预测,并添加了dropout层以避免过拟合。训练网络的优化器和损失函数分别是Adam优化器和分类交叉熵,这对于分类问题来说是典型的。 - 划分数据
在架构训练过程中,训练数据集被分为两部分:训练数据集和验证数据集。交叉验证:交叉验证信息用于在训练期间检查模型的性能,从而识别模型可能出现的过拟合或欠拟合。 - 训练模型
训练过程使用训练数据进行,而验证集用于在每个epoch后测量模型精度。训练过程的一部分包括将数据馈送到网络,以及根据损失和多个epoch来调整权重。 - 保存模型
最后,当模型训练完成后,将其保存到磁盘。
结论本文介绍了如何使用Python的TFLearn构建一个基于CNN的图像分类器,用于简化识别猫狗的任务。模型经过标记、预处理和数据集训练,在识别图像方面达到了高准确率。卷积层和池化层有助于从图像中鲁棒地提取特征,并且模型架构设计旨在避免过拟合。因此,本项目可以用于学习如何实现CNN进行图像分类,同时展示了在现实世界环境中创建和应用机器学习模型的过程。
|