机器学习与深度学习实验项目3 卷积神经网络实现图片分类

一、实验目的

1)掌握在MindSpore中构建、训练卷积神经网络的方法

2)理解卷积神经网络在图像分类任务中的应用原理

3)学习CIFAR-10数据集的预处理和特征提取技术

4)掌握模型性能评估和结果可视化的基本方法

、实验内容

1)仿照MNIST手写体数字识别,用MindSpore框架实现卷积神经网络对CIFAR-10进行分类

2)构建包含卷积层、池化层、批归一化层的深度神经网络

3)实现数据增强、模型训练、性能评估等完整流程

4)开发实时图像分类和单张图像测试功能

、实验原理

1)卷积神经网络基本结构:卷积层提取局部特征,池化层降低特征维度,全连接层实现分类

2)批归一化技术:加速训练收敛,提高模型泛化能力

3)数据增强:通过随机裁剪、水平翻转增加数据多样性

4)Adam优化器:自适应学习率调整,提高训练效率

5)Softmax交叉熵损失函数:多分类问题的标准损失函数

实验步骤

1)下载CIFAR-10数据集并检查数据完整性

2)对数据集进行标准化预处理和增强处理

3)构建三层卷积神经网络结构

4)设置超参数并开始模型训练

5)实时监控训练过程,调整网络结构优化性能

6)使用测试集评估模型准确率

7)通过混淆矩阵和可视化结果分析模型表现

五、代码和执行结果展示

1)具体核心代码分析如下:

①网络结构定义:

|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| class EnhancedCNN(nn.Cell): def init(self, num_classes=10): super(EnhancedCNN, self).init() self.conv1 = nn.Conv2d(3, 32, kernel_size=3, pad_mode='same') self.bn1 = nn.BatchNorm2d(32) self.relu1 = nn.ReLU() self.pool1 = nn.MaxPool2d(kernel_size=2, stride=2) |

该部分定义了网络的基本构建块,采用经典的卷积-批归一化-激活-池化组合。卷积层使用same填充模式保持特征图尺寸,批归一化层加速训练收敛,ReLU激活函数引入非线性特性,最大池化层在保留主要特征的同时降低计算复杂度。这种模块化设计便于网络结构的扩展和修改。

②数据预处理管道:

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| def create_dataset(data_path, batch_size=64, training=True): transform = [ vision.RandomCrop(32, padding=4), vision.RandomHorizontalFlip(), vision.Rescale(1.0/255.0, 0.0), vision.Normalize([0.4914, 0.4822, 0.4465], [0.2023, 0.1994, 0.2010]), vision.HWC2CHW() ] |

数据预处理管道实现了完整的图像变换流程,训练阶段包含数据增强操作,测试阶段仅进行基础预处理。随机裁剪和水平翻转有效增加了数据多样性,归一化和标准化确保输入数据分布一致。管道式设计使得预处理步骤清晰有序,便于维护和调试。

③模型训练循环:

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| def train(model, dataset, loss_fn, optimizer, epochs=10): net_with_loss = nn.WithLossCell(model, loss_fn) train_net = nn.TrainOneStepCell(net_with_loss, optimizer) for epoch in range(epochs): for data in dataset.create_tuple_iterator(): loss = train_net(images, labels) |

训练过程采用MindSpore特有的计算图模式,通过WithLossCell和TrainOneStepCell封装简化训练逻辑。每个周期内遍历完整数据集,前向传播计算损失,反向传播更新参数。这种设计充分利用了框架的自动微分特性,同时保持了代码的简洁性。

④模型评估函数:

|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| def evaluate(model, dataset): model.set_train(False) for data in dataset.create_tuple_iterator(): outputs = model(images) preds = ops.argmax(outputs, 1) correct += ops.sum(ops.equal(preds, labels)).asnumpy() |

评估阶段首先设置模型为评估模式,关闭Dropout等训练特有操作。通过argmax获取预测类别,与真实标签比较计算准确率。使用set_train(False)确保评估过程的确定性,asnumpy()将张量转换为NumPy数组便于后续分析。

⑤实时分类模块:

|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| def real_time_classification(model, camera_index=0): while True: img = cv2.resize(frame, (32, 32)) img_tensor = ms.Tensor(img, ms.float32) output = model(img_tensor) pred = ops.argmax(output, 1).asnumpy()[0] |

实时分类模块实现了从摄像头捕获、预处理到预测的完整流程。图像缩放至模型输入尺寸,转换为MindSpore张量格式,通过训练好的模型获取预测结果。循环结构支持连续处理,为用户提供实时的交互体验。

⑥可视化结果生成:

|-----------------------------------------------------------------------------------------------------------------------------------------------------|
| def plot_training_history(loss, accuracy): plt.subplot(1, 2, 1) plt.plot(loss, label='训练损失') plt.subplot(1, 2, 2) plt.plot(accuracy, label='训练准确率') |

可视化函数使用matplotlib生成训练过程曲线,双子图设计同时展示损失和准确率变化趋势。中文标签和网格线增强了图表可读性,自动保存功能便于结果归档和报告生成。

2)实验结果展示和分析

图 1 最终测试准确率

图1详细记录了40轮训练过程中模型性能的演变轨迹。从第24轮到第40轮,损失值从0.5034稳步下降至0.4160,准确率从83.62%提升至86.49%,呈现出良好的收敛趋势。训练耗时在59.46至131.64秒之间波动,可能与计算资源调度和批次处理复杂度有关。特别值得注意的是,在训练后期损失下降速度减缓而准确率仍持续提升,表明模型正在学习更精细的特征表示。测试阶段达到89.86%的准确率,显著高于训练准确率,验证了模型具有良好的泛化能力。验证测试中五个批次的准确率稳定在91.41%至92.97%之间,总体准确率达91.72%,进一步证实了模型预测的稳定性。

图 2 训练过程可视化分析

图2的训练损失和准确率曲线直观展示了模型的学习动态。损失曲线呈现典型的指数衰减模式,初期下降迅速,后期趋于平缓,符合梯度下降算法的预期行为。准确率曲线则呈现S型增长,前期提升较快,中期增速放缓,后期接近饱和状态。两条曲线的同步性良好,没有出现明显的过拟合迹象,表明正则化措施(如Dropout)发挥了预期效果。从曲线形态可以看出,模型在约30轮后进入稳定阶段,后续训练主要进行微调优化,这一观察为确定最优训练周期提供了依据。

图 3 混淆矩阵深度分析

图3的混淆矩阵揭示了模型在10个类别上的详细分类表现。对角线元素代表正确分类的样本数,其中汽车(5731)和飞机(5640)识别率最高,反映出这些类别具有较明显的视觉特征。非对角线元素显示了类别间的混淆情况,特别是猫(139)和狗(26)等动物类别的误判较多,这与实际中这些类别形态相似性较高相符。矩阵整体呈现明显的对角线优势,但部分非对角线元素值偏高,指示了模型在细粒度分类上的挑战。颜色渐变直观反映了分类质量,深蓝色区域集中在对角线,浅蓝色分散在非对角线,符合优质分类器的典型特征。

图 4 实时狗分类分析

图4反映的白色狗的实时分类结果(置信度0.93)进一步验证了模型的鲁棒性。尽管图像包含复杂背景和动态表情,模型仍能准确识别并给出高置信度评分。狗的蓬松毛发和独特形态为分类提供了充分特征,而高置信度表明模型对该类别的特征学习较为充分。界面中的人物身影暗示了实际应用场景的复杂性,模型在此环境下仍保持稳定性能,展现了良好的环境适应性。

相关推荐
爱问问题的小李2 小时前
AI生成的Threejs常用Api学习计划
人工智能·学习
陈天伟教授2 小时前
人工智能应用- 搜索引擎:04. 网页重要性评估
人工智能·神经网络·搜索引擎·语言模型·自然语言处理
波动几何2 小时前
信息图设计提示词方案
人工智能
audyxiao0012 小时前
AI一周重要会议和活动概览(2.16-2.22)
人工智能·机器学习·一周会议与活动
AI英德西牛仔2 小时前
deepseek word 排版
人工智能
KG_LLM图谱增强大模型3 小时前
LLM能否通过语料库统计量成为可靠的检索触发器?
人工智能·知识图谱
呆萌很3 小时前
transforms.ColorJitter 数据增强工具
人工智能
Sheffi663 小时前
AI智能体编程时代的技术架构:Claude Agent与OpenAI Codex在Xcode中的集成原理
人工智能·架构·xcode
Purple Coder3 小时前
神经网络与深度学习
人工智能·深度学习·神经网络