人工智能应用-实验6-卷积神经网络分类minst手写数据集

文章目录

    • 🧡🧡实验内容🧡🧡
    • 🧡🧡代码🧡🧡
    • 🧡🧡分析结果🧡🧡
    • 🧡🧡实验总结🧡🧡

🧡🧡实验内容🧡🧡

编写卷积神经网络分类,实现对 MNIST 数据集分类的操作。

🧡🧡代码🧡🧡

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.optim as optim
from torch import nn, optim
from time import time# 准备数据集
batch_size = 64
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.5,), (0.5,))
])
train_dataset = datasets.MNIST(root='../dataset/mnist/',train=True,download=True,transform=transform)
train_loader = DataLoader(train_dataset,shuffle=True,batch_size=batch_size)
test_dataset = datasets.MNIST(root='../dataset/mnist',train=False,download=True,transform=transform)
test_loader = DataLoader(test_dataset,shuffle=False,batch_size=batch_size)# @title CNN net
class CNN_net(nn.Module):def __init__(self):super().__init__()self.conv1 = nn.Conv2d(1, 16, kernel_size=5)  # 卷积1self.pooling1 = nn.MaxPool2d(2)  # 最大池化self.relu1 = nn.ReLU()  # 激活self.conv2 = nn.Conv2d(16, 32, kernel_size=5)self.pooling2 = nn.MaxPool2d(2)self.relu2 = nn.ReLU()self.fc = nn.Linear(512, 10)  # 全连接def forward(self, x):batch_size = x.size(0)x = self.conv1(x)x = self.pooling1(x)x = self.relu1(x)x = self.conv2(x)x = self.pooling2(x)x = self.relu2(x)x = x.view(batch_size, -1)x = self.fc(x)return xmodel = CNN_net()
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)def train(epoch):time0 = time()  # 记录下当前时间loss_list = []for e in range(epoch):running_loss = 0.0for images, labels in train_loader:outputs = model(images)  # 前向传播获取预测值loss = criterion(outputs, labels)  # 计算损失loss.backward()  # 进行反向传播optimizer.step()  # 更新权重optimizer.zero_grad()  # 清空梯度running_loss += loss.item()  # 累加损失# 一轮循环结束后打印本轮的损失函数print("Epoch {} - Training loss: {}".format(e, running_loss / len(train_loader)))loss_list.append(running_loss / len(train_loader))# 打印总的训练时间print("\nTraining Time (in minutes) =", (time() - time0) / 60)# 绘制损失函数随训练轮数的变化图plt.plot(range(1, epoch + 1), loss_list)plt.xlabel('Epochs')plt.ylabel('Loss')plt.title('Training Loss')plt.show()train(5)
from sklearn.metrics import confusion_matrix
import seaborn as sns
import matplotlib.pyplot as pltdef test():model.eval()  # 将模型设置为评估模式correct = 0total = 0all_predicted = []all_labels = []with torch.no_grad():for images, labels in test_loader:outputs = model(images)_, predicted = torch.max(outputs.data, dim=1)total += labels.size(0)correct += (predicted == labels).sum().item()all_predicted.extend(predicted.tolist())all_labels.extend(labels.tolist())print('Model Accuracy =:%.4f' % (correct / total))# 绘制混淆矩阵cm = confusion_matrix(all_labels, all_predicted)plt.figure(figsize=(8, 6))sns.heatmap(cm, annot=True, fmt=".0f", cmap="Blues")plt.xlabel("Predicted Labels")plt.ylabel("True Labels")plt.title("Confusion Matrix")plt.show()test()

🧡🧡分析结果🧡🧡

数据预处理:

  • 加载数据集:
    加载torch库中自带的minst数据集
  • 转换数据:
    先转为tensor变量(相当于直接除255归一化到值域为(0,1))
    然后根据std=0.5,mean=0.5,再将值域标准化到(-1,1)。做这个实验时,上网了解发现minst最合适的的std和mean分别为0.1307, 0.3081,但为了与上个BP网络实验作为对照,本次实验依然采用std和mear均为0.5,并且它们的值对结果的影响没有很大。

设置基本参数:
在这里插入图片描述

构建CNN神经网络:

  • 5 x 5的卷积核,输入通道为1,输出通道为16:此时图像矩经过卷积核后尺寸变成24 x 24。
  • 2 x 2 的最大池化层:此时图像大小缩短一半,变成 12 x 12,通道数不变;
  • 再次经过 5 x 5 的卷积核,输入通道为16,输出通道为32:此时图像尺寸经过卷积核后变成8 *8。
  • 再次经过 2 x 2 的最大池化层:此时图像大小缩短一半,变成4 x 4,通道数不变;
  • 最后将图像整型变换成向量,输入到全连接层中:输入一共有4 x 4 x 32 = 512 个元素,输出为10.
    在这里插入图片描述

模型训练:
在这里插入图片描述
可见,虽然只经过5个epoch,但是花的时间为3.3min,跟BP神经网络训练15个epoch时间差不多。

模型评估:
在这里插入图片描述
准确率达98.26%,比BP神经网络97.65%要高

分析卷积层、池化层的层数、卷积核大小对分类准确率的影响

更改卷积层层数为2、池化层层数为2、卷积核大小为4:

    def __init__(self):super().__init__()self.conv1 = nn.Conv2d(1, 16, kernel_size=4) # 第一层卷积self.pooling1 = nn.MaxPool2d(2) # 第一层池化self.relu1 = nn.ReLU() # 激活self.conv2 = nn.Conv2d(16, 32, kernelsize=4) # 第二层卷积self.pooling2 = nn.MaxPool2d(2) # 第二层池化self.relu2 = nn.ReLU() # 激活self.fc = nn.Linear(512, 10) # 全连接

在这里插入图片描述
在这里插入图片描述

更改卷积层层数为2、池化层层数为2、卷积核大小为3:

    def __init__(self):super().__init__()self.conv1 = nn.Conv2d(1, 16, kernel_size=3) # 第一层卷积self.pooling1 = nn.MaxPool2d(2) # 第一层池化self.relu1 = nn.ReLU() # 激活self.conv2 = nn.Conv2d(16, 32, kernel_size=3) # 第二层卷积self.pooling2 = nn.MaxPool2d(2) # 第二层池化self.relu2 = nn.ReLU() # 激活self.fc = nn.Linear(512, 10) # 全连接

在这里插入图片描述
在这里插入图片描述

更改卷积层层数为3、池化层层数为3、卷积核大小为3:

    def __init__(self):super().__init__()self.conv1 = nn.Conv2d(1, 16, kernel_size=3) # 第一层卷积self.pooling1 = nn.MaxPool2d(2) # 第一层池化self.relu1 = nn.ReLU() # 激活self.conv2 = nn.Conv2d(16, 32, kernel_size=3) # 第二层卷积self.pooling2 = nn.MaxPool2d(2) # 第二层池化self.relu2 = nn.ReLU() # 激活self.conv3 = nn.Conv2d(32, 64, kernel_size=3) # 第三层卷积self.pooling3 = nn.MaxPool2d(2) # 第三层池化self.relu3 = nn.ReLU() # 激活self.fc = nn.Linear(64, 10) # 全连接

在这里插入图片描述
在这里插入图片描述
更改卷积层层数为4、池化层层数为4、卷积核大小为3:

    def __init__(self):super().__init__()self.conv1 = nn.Conv2d(1, 16, kernel_size=3, padding=1) # 第一层卷积self.pooling1 = nn.MaxPool2d(2) # 第一层池化self.relu1 = nn.ReLU() # 激活self.conv2 = nn.Conv2d(16, 32, kernel_size=3, padding=1) # 第二层卷积self.pooling2 = nn.MaxPool2d(2) # 第二层池化self.relu2 = nn.ReLU() # 激活self.conv3 = nn.Conv2d(32, 64, kernel_size=3, padding=1) # 第三层卷积self.pooling3 = nn.MaxPool2d(2) # 第三层池化self.relu3 = nn.ReLU() # 激活self.conv4 = nn.Conv2d(64, 128, kernel_size=3, padding=1) # 第四层卷积self.pooling4 = nn.MaxPool2d(2) # 第四层池化self.relu4 = nn.ReLU() # 激活self.fc = nn.Linear(128, 10) # 全连接

在这里插入图片描述
在这里插入图片描述

总结以上结果如下表(epoch=5):
在这里插入图片描述
由此可知:

  • 卷积层数目:
    当卷积层数目增加时,模型的复杂度也随之增加,有助于提取更加抽象和复杂的特征,从而提高分类准确率。观察实验结果,最为明显的是时间会显著增加,其次准确率在3层时较2层时降低,而在4层时又显著增加,考虑因为因为epoch过小,训练不充分;其次在4层时防止卷积后特征维度变少,增加了padding保留了最边边的数据特征,因此总体来说卷积层数增加,对准确率有较好的影响。
  • 池化层数目:
    池化层的作用是逐渐降低特征图的空间维度,从而减少模型的参数数量,并且具有一定的平移不变性。在一定程度上,池化层可以帮助防止过拟合,但过多的池化层可能会导致信息丢失。池化层的数目往往和卷积层数目相关,在本实验中,其对准确率的影响同卷积层数目对准确率的影响。
  • 卷积核大小:
    较大的卷积核大小可以捕获更大范围的特征,而较小的卷积核大小可以捕获更局部的特征。从实验结果看,相同卷积层和池化层数目下,卷积核更大的准确率会高一些,运行时间也有所增加。

🧡🧡实验总结🧡🧡

CNN卷积网络与BP神经网络的比较:

  • 应用场景:
    CNN: 卷积神经网络主要用于图像处理和计算机视觉任务。由于卷积层和池化层的设计,CNN能够有效提取图像中的局部特征,并具备平移不变性和局部连接的特点。
    BP: 反向传播算法是一种用于训练神经网络的优化方法,可应用于各种机器学习任务,包括图像分类、语音识别、自然语言处理等。
  • 网络结构:
    CNN: 卷积神经网络采用卷积层、池化层和全连接层等结构,通过卷积操作和权重共享有效减少了参数数量,并能够处理高维数据(如图像)。
    BP: 反向传播算法通常用于训练多层前馈神经网络,其中每个神经元与下一层的所有神经元相连接。
  • 特点:
    CNN: 卷积神经网络在处理图像等二维数据时具有较好的性能,能够自动学习图像中的特征,并具备一定的平移不变性和局部连接性。
    BP: 反向传播算法是一种通用的神经网络训练方法,可以适用于多种任务,并且能够通过反向传播更新网络的权重,从而实现模型的优化和学习。
    在对于分类minst手写数据集的实验中,CNN准确率更胜一筹,从而也看出CNN相较于BP神经网络在图像处理方面有较大的优势。但相比之下,CNN网络结构更加复杂,从而运行时间花费更多(如两次实验中,epoch=15的BP神经网络与epoch=5的CNN网络花费时间均为3到4minutes,可见CNN网络花费时间约为BP神经网络的3倍)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

521源码-在线客服-CRMChat网页版客服系统 UNIAPP 全方位在线客服系统源码与管理体系平台

CRMChat客服系统:基于Swoole4Tp6RedisVueMysql构建的高效沟通桥梁 CRMChat是一款独立且高性能的在线客服系统,它结合了Swoole4、Tp6、Redis、Vue以及Mysql等先进技术栈,为用户提供了卓越的在线沟通体验。该系统不仅支持在Pc端、移动端、小程…

列表页9大样式,保准你看了就能掌握。

上文:一张图集齐B端列表页的16大组件,召唤神龙,看后恍然大悟。 普通列表/基础列表/常规列表 不适合移动端展示 复杂列表 加入了统计 适合移动端 项目列表 适合移动端 应用列表 适合移动端 多级列表 复杂的多级结构,下图展示了…

美国教育数据分析

文章目录 第1关:认识数据第2关:数据预处理第3关:数学成绩预测 第1关:认识数据 编程要求 根据提示,在右侧Begin-End区域补充代码,查看数据属性名称。 测试说明 程序会调用你实现的方法,查看数据…

SpringBoot——整合MyBatis

目录 MyBatis 项目总结 1、创建SQL表 2、新建一个SpringBoot项目 3、pom.xml添加依赖 4、application.properties配置文件 5、User实体类 6、UserMapper接口 7、UserMapper.xml映射文件 8、UserController控制器 9、SpringBootMyBatisApplication启动类 10、使用Po…

C语言 | Leetcode C语言题解之第98题验证二叉搜索树

题目: 题解: /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isValid(struct TreeNode * root,long left,long right){if(!root){return true;}long…

一个超级简单的Python UI库:NiceGUI

大家好,图形用户界面(GUI)的开发往往被看作是一项复杂且繁琐的任务。Python作为一门强大的编程语言,提供了许多优秀的库来帮助开发者实现这一目标。今天,我们将介绍一个名为NiceGUI的库,它能帮助你轻松构建…

Science Robotics 封面论文:一种使用半球形纳米线阵列实现机器人视觉的超宽视场针孔复眼

研究背景 从生物复眼中汲取灵感,拥有一系列生动多样视觉功能特征的人工视觉系统最近脱颖而出。然而,这些人工系统中的大多数都依赖于可转换的电子设备,这些电子设备受到全局变形的复杂性和受限几何形状的影响,以及光学和探测器单元…

好的架构是进化来的,不是设计来的

很多年前,读了子柳老师的《淘宝技术这十年》。这本书成为了我的架构启蒙书,书中的一句话像种子一样深埋在我的脑海里:“好的架构是进化来的,不是设计来的”。 2015 年,我加入神州专车订单研发团队,亲历了专…

Wav2Vec 2.0:语音表示自监督学习框架

Wav2Vec 2.0是目前自动语音识别的模型之一。 Wav2Vec 2.0 代表了无监督预训练技术在语音识别领域的重大进步。这些方法通过直接从原始音频中学习,无需人工标记,因此可以有效利用大量未标记的语音数据集。相比于传统的监督学习数据集通常只有大约几百小时…

文章解读与仿真程序复现思路——电力系统保护与控制EI\CSCD\北大核心《基于改进Q学习算法和组合模型的超短期电力负荷预测》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Cookie 和 Session概念及相关API

目录 1.Cookie概念 2.理解会话机制 (Session) 3.相关API 3.1HttpServletRequest 3.2HttpServletResponse 3.3HttpSession 3.4Cookie 4.代码示例: 实现用户登陆 1.Cookie概念 Cookie 是存储在用户本地终端(如计算机、手机等)上的数据片段。 它…

反射获取或修改对象属性的值

利用反射既可以获取也可以写入,首先咱们先写几个获取的例子。 一:利用反射修改各数据(利用resultField.set修改) 首先定义实体类 public class Dog {private String dogUser;private int age;把DogUser的"hahaha"改为"geggegegege&quo…

LiveGBS流媒体平台GB/T28181用户手册-版本信息:查看机器码、切换查看流媒体服务

LiveGBS流媒体平台GB/T28181用户手册--版本信息:查看机器码、切换查看流媒体服务 1、版本信息1.1、查看机器码1.2、多个流媒体服务1.3、提交激活 2、搭建GB28181视频直播平台 1、版本信息 版本信息页面,可以查看到信令服务 流媒体服务相关信息,包含硬件…

免费分享一套微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】,帅呆了~~

大家好,我是java1234_小锋老师,看到一个不错的微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序旅游推荐(智慧旅游)系统(SpringBoot后端Vue管理端) Java毕业设计…

小程序丨数据功能如何使用

查询发布完成后,如发现信息有误或想要修改信息,老师可以使用数据功能在线修改已发布的查询内容。 数据功能包含导出、添加、编辑、更多操作,下面来教大家如何使用吧。 📌使用教程 数据功能主要用于在线修改已发布的查询内容&#…

C语言 | Leetcode C语言题解之第108题将有序数组转换为二叉搜索树

题目: 题解: struct TreeNode* helper(int* nums, int left, int right) {if (left > right) {return NULL;}// 选择任意一个中间位置数字作为根节点int mid (left right rand() % 2) / 2;struct TreeNode* root (struct TreeNode*)malloc(sizeo…

ElasticSearch IK分词器的安装、词典扩展与停用

🏷️个人主页:牵着猫散步的鼠鼠 🏷️系列专栏:云原生与服务部署-专栏 🏷️个人学习笔记,若有缺误,欢迎评论区指正 目录 ​编辑 1. 前言 2. IK分词器安装 3. IK分词器词典扩展与停用 4. 总…

汽车整车检测的原由(北重试验平台制造厂家)

汽车整车检测是指对整车系统和构造各部分的性能、可靠性、安全性等方面进行全面检查和评估的过程。它是在汽车生产制造和销售使用环节中,为了保障驾驶安全和质量而必不可少的一项检测和评估工作。 1. 提升行车安全 汽车整车检测能够全面评估车辆的性能和安全性&…

音视频-常用的分析工具介绍-连续补充

目录 1:Audacity 2:MediaInfo 3:MP4Box 4:hexinator 5:Adobe Audition 6:VideoEye 7:YUVplayer (YUV/RGB播放器) 在做音视频分析时,经常用到各种分析工…

【有手就行】使用你自己的声音做语音合成,CPU都能跑,亲测有效

此文介绍在百度飞桨上一个公开的案例,亲测有效。 厌倦了前篇一律的TTS音色了吗?打开短视频听来听去就是那几个声音,快来试试使用你自己的声音来做语音合成吧!本教程非常简单,只需要你能够上传自己的音频数据就可以(建议…