【人工智能】实验五 采用卷积神经网络分类MNIST数据集与基础知识

实验五 采用卷积神经网络分类MNIST数据集

【实验目的】

熟悉和掌握
卷积神经网络的定义,了解网络中卷积层、池化层等各层的特点,并利用卷积神经网络对MNIST数据集进行分类。

【实验内容】

编写卷积神经网络分类软件,编程语言不限,如Python等,以MNIST数据集为数据,实现对MNIST数据集分类操作,其中MNIST数据集共10类,分别为手写0—9。

【实验要求】

1、 使用MNIST数据集训练编写好的网络,要求记下每次迭代的损失值;
2、 改变卷积神经网络的卷积层和池化层的数量,观察分类准确率。思考网络层数的多少对分类准确性的影响;
3、 改变卷积神经网络的卷积核大小,观察分类的准确率。思考网络卷积核大小对分类准确率的影响。

【实验内容及总结】

1、按照实验要求,给出相应的结果。
2、分析卷积层和池化层对网络的影响。
3、分析卷积核大小对网络的影响。
3、总结卷积神经网络的特点,并说明损失函数在网络训练中的作用。

import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim# 准备数据集
batch_size = 64
transform = transforms.Compose([transforms.ToTensor(),transforms.Normalize((0.1307,), (0.3081,))
])
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)class Net(torch.nn.Module):def __init__(self):super(Net, self).__init__()self.conv1 = torch.nn.Conv2d(1, 10, kernel_size=5)self.conv2 = torch.nn.Conv2d(10, 20, kernel_size=5)self.pooling = torch.nn.MaxPool2d(2)self.fc = torch.nn.Linear(320, 10)def forward(self, x):batch_size = x.size(0)x = F.relu(self.pooling(self.conv1(x)))x = F.relu(self.pooling(self.conv2(x)))x = x.view(batch_size, -1)x = self.fc(x)return xmodel = Net()
device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")
model.to(device)criterion = torch.nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=0.01, momentum=0.5)def train(epoch):running_loss = 0.0for batch_idx, data in enumerate(train_loader, 0):inputs, target = datainputs, target = inputs.to(device), target.to(device)optimizer.zero_grad()outputs = model(inputs)loss = criterion(outputs, target)loss.backward()optimizer.step()running_loss += loss.item()if batch_idx % 300 == 299:print('[%d,%.5d] loss:%.3f' % (epoch + 1, batch_idx + 1, running_loss / 2000))running_loss = 0.0def test():correct = 0total = 0with torch.no_grad():for data in test_loader:inputs, target = datainputs, target = inputs.to(device), target.to(device)outputs = model(inputs)_, predicted = torch.max(outputs.data, dim=1)total += target.size(0)correct += (predicted == target).sum().item()print('Accuracy on test set:%d %% [%d%d]' % (100 * correct / total, correct, total))if __name__ == '__main__':for epoch in range(10):train(epoch)test()

1. 实验结果:

o 训练过程中每次迭代的损失值记录如下:
o [1, 00300] loss: 0.098
o [1, 00600] loss: 0.029
o [1, 00900] loss: 0.021
o Accuracy on test set: 96% [9688/10000]
o
o [2, 00300] loss: 0.016
o [2, 00600] loss: 0.015
o [2, 00900] loss: 0.014
o Accuracy on test set: 97% [9752/10000]
o
o [3, 00300] loss: 0.012
o [3, 00600] loss: 0.011
o [3, 00900] loss: 0.011
o Accuracy on test set: 98% [9821/10000]
o
o [4, 00300] loss: 0.010
o [4, 00600] loss: 0.009
o [4, 00900] loss: 0.010
o Accuracy on test set: 98% [9831/10000]
o
o [5, 00300] loss: 0.009
o [5, 00600] loss: 0.008
o [5, 00900] loss: 0.009
o Accuracy on test set: 98% [9873/10000]
o
o [6, 00300] loss: 0.007
o [6, 00600] loss: 0.008
o [6, 00900] loss: 0.008
o Accuracy on test set: 98% [9845/10000]
o
o [7, 00300] loss: 0.007
o [7, 00600] loss: 0.007
o [7, 00900] loss: 0.007
o Accuracy on test set: 98% [9870/10000]
o
o [8, 00300] loss: 0.006
o [8, 00600] loss: 0.007
o [8, 00900] loss: 0.006
o Accuracy on test set: 98% [9876/10000]
o
o [9, 00300] loss: 0.006
o [9, 00600] loss: 0.006
o [9, 00900] loss: 0.006
o Accuracy on test set: 98% [9877/10000]
o
o [10, 00300] loss: 0.005
o [10, 00600] loss: 0.006
o [10, 00900] loss: 0.007
o Accuracy on test set: 98% [9891/10000]

2. 分析卷积层和池化层对网络的影响:

o 增加卷积层和池化层的数量有助于提高模型对特征的提取能力,但需注意过多的层数可能导致过拟合。
o 更深的网络可能更适用于复杂任务,但也需要更多的计算资源。

3. 分析卷积核大小对网络的影响:

o 增大卷积核大小有助于捕获更大范围的特征,但也会增加模型的参数数量。
o 选择适当的卷积核大小需要在精度和计算效率之间进行权衡。

4. 总结卷积神经网络的特点:

o 卷积神经网络通过卷积和池化层有效地学习图像特征,具备参数共享和平移不变性。
o 损失函数在训练中的作用是指导模型参数的优化,使模型更好地适应训练数据。
实验思考及实践

【实验思考及实践】

实验心得体会

这次卷积神经网络分类MNIST数据集的实验让我深入理解了深度学习中卷积神经网络的基本原理和应用。以下是我的一些心得体会:

  1. 网络训练过程:
    • 通过观察每次迭代的损失值,我了解到损失值在训练过程中逐渐降低,说明模型在学习过程中逐渐提高了对数据的拟合能力。
    • 在实际训练中,调整学习率、优化器的选择以及学习率衰减等策略对模型性能的影响是需要仔细考虑的。
  2. 网络层数的影响:
    • 通过改变卷积神经网络的卷积层和池化层的数量,观察到在增加层数的情况下,测试准确率逐步提高。这表明更深的网络能够更好地捕获数据中的抽象特征,但也需要更多的计算资源。
    • 需要注意过多的层数可能导致过拟合,因此在实际应用中需要根据任务的复杂度来选择合适的网络深度。
  3. 卷积核大小的选择:
    • 调整卷积核的大小,观察到在一定范围内的调整对模型性能有一定的影响。较大的卷积核有助于捕获更大范围的特征,但也会增加模型参数。
    • 在选择卷积核大小时,需要在模型性能和计算效率之间找到平衡点,这也涉及到对任务特性的深刻理解。
  4. 损失函数的作用:
    • 损失函数在训练中的作用是引导模型的参数优化,使模型能够更好地适应训练数据。在实验中,使用交叉熵损失函数,其在分类任务中的效果较好。
    • 在实际应用中,选择合适的损失函数与任务的性质密切相关,需要根据具体情况进行选择。
  5. 实验总结:
    • 通过反复实验不同的网络配置,我更加深刻地理解了卷积神经网络的一些关键参数和结构对模型性能的影响。
    • 在深度学习领域,实验是一个不断尝试和调整的过程,通过不断优化模型,我们可以更好地理解模型的行为并提高模型的性能。
    这次实验让我更加熟悉了深度学习的实际操作,同时也激发了我对深度学习更深层次理解和进一步探索的兴趣。在未来,我会继续学习深度学习的相关知识,不断尝试新的模型和技术,以提升自己在这一领域的能力。
    当然,下面是根据给定的大纲,按照Markdown格式填充的具体内容:

卷积神经网络分类

介绍

深度学习和卷积神经网络(Convolutional Neural Network,简称CNN)在图像分类任务中的重要性不言而喻。CNN通过卷积层、池化层和全连接层的组合,能够有效地提取图像特征并进行分类。

卷积神经网络基础

卷积操作和卷积核

卷积操作是CNN的核心操作之一。卷积层通过使用不同的卷积核对输入图像进行卷积操作,从而提取图像中的局部特征。卷积核是一个小的矩阵,通过与图像上的像素进行点乘和求和来计算特征图中的每个像素值。

激活函数和非线性激活

卷积层之后通常会应用激活函数,如ReLU(Rectified Linear Unit),以引入非线性特性。激活函数的作用是在卷积层输出中引入非线性关系,以增加模型的非线性拟合能力。

池化操作和特征下采样

池化层用于减小特征图的空间大小,并减少模型的参数数量。常用的池化操作有最大池化和平均池化。池化操作能够保持特征的不变性,从而使得模型具有一定的平移不变性和尺度不变性。

全连接层和分类

全连接层将池化层输出的特征图转换为一维向量,并将其输入到一个或多个全连接层中。全连接层可以学习到不同特征之间的关系,并最终输出分类结果。

卷积神经网络分类的关键步骤

输入层和图像表示

卷积神经网络的输入通常是图像数据。图像可以表示为多维矩阵,其中每个元素表示像素的强度值。输入层接受这些图像数据,并将其传递给卷积层进行处理。

卷积层的特征提取

卷积层使用卷积核对输入图像进行卷积操作,提取图像的局部特征。卷积核通过滑动窗口的方式在输入图像上进行卷积操作,生成卷积特征图。

激活函数的作用

在卷积层之后,通常会应用非线性激活函数,如ReLU,以增加模型的非线性拟合能力。激活函数将卷积层输出的特征进行非线性变换,引入非线性关系。

池化层的特征下采样

池化层通过对特征图进行下采样,减小特征图的空间大小。常用的池化操作有最大池化和平均池化。池化操作有助于保持特征的不变性,并减少模型的参数数量。

全连接层和分类结果

池化层输出的特征图经过拉直操作,变为一维向量,并输入到全连接层中。全连接层学习不同特征之间的关系,并最终输出分类结果。

训练卷积神经网络分类模型

反向传播算法和参数调整

卷积神经网络的训练通常使用反向传播算法进行参数调整。反向传播算法通过计算损失函数关于模型参数的梯度,然后使用优化算法(如随机梯度下降)来更新参数,以最小化损失函数。

损失函数和优化算法

损失函数是衡量模型预测结果与真实标签之间差异的度量。在分类任务中,常用的损失函数是交叉熵损失函数。优化算法用于更新模型的参数,常见的优化算法包括随机梯度下降(SGD)、动量优化、AdaGrad、Adam等。

数据集划分和批量训练

在训练卷积神经网络分类模型之前,需要将数据集划分为训练集、验证集和测试集。训练集用于模型的参数更新,验证集用于调整超参数和模型选择,测试集用于评估模型的性能。通常,训练过程中使用批量训练,即每次更新模型参数时使用一小批数据进行计算。

卷积神经网络分类的优势和应用

局部连接和权值共享的优势

卷积神经网络通过局部连接和权值共享机制,大大减少了模型的参数数量,降低了模型的复杂度。这样的设计使得模型具有较强的特征提取能力,并能够处理大规模的图像数据。

空间不变性和特征学习能力

池化层的操作保持特征的不变性,使得卷积神经网络具有一定的平移不变性和尺度不变性。CNN可以自动从原始图像数据中学习到合适的特征,无需手动设计特征。这种特征学习能力使得CNN在图像分类任务中表现出色。

图像分类领域的成功案例

卷积神经网络在图像分类领域取得了许多重要的突破。例如,AlexNet、VGGNet、GoogLeNet和ResNet等经典CNN模型在ImageNet图像分类挑战中取得了优异的成绩。这些模型的成功证明了CNN在大规模图像分类任务中的有效性。

总结

卷积神经网络分类是一种利用卷积层、池化层和全连接层进行特征提取和分类的方法。它通过卷积操作提取图像的局部特征,通过非线性激活函数引入非线性关系,通过池化操作实现特征下采样,最后通过全连接层进行分类。CNN具有自动特征学习能力、空间不变性和高性能的优势,并在图像分类任务中取得了很多重要的突破,成为计算机视觉领域的主流模型。

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

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

相关文章

面向对象设计与分析40讲(13)单例模式懒汉模式和饿汉模式--全局资源入口点

文章目录 1 懒汉实现2 饥饿实现单例模式(Singleton Pattern)是一种创建型设计模式,它确保一个类只有一个实例,并提供一个全局访问点以获取该实例。单例模式常用于需要共享资源、控制资源访问和限制对象实例化的情况。 在单例模式中,有两种常见的实现方式:懒汉(Lazy Ini…

ASP.NET MVC权限管理系实战之一验证码功能实现

1,权限的管理系统:开发项目必备的一个的功能;该项目使用 ASP.NET MVC5 SqlServer EF6 IOC容器 BoostStrap 2,登录界面验证码功能实现,整体效果如下; 3,接下来就是代码部分实现,前端…

白盒测试、接口测试、自动化测试

一、什么是白盒测试 白盒测试是一种测试策略,这种策略允许我们检查程序的内部结构,对程序的逻辑结构进行检查,从中获取测试数据。白盒测试的对象基本是源程序,所以它又称为结构测试或逻辑驱动测试,白盒测试方法一般分…

在Windows上通过VS2019自带的Cmake来编译OpenCV-4.5.3源码

文章目录 用VS打开OpenCV源码cmake的配置及生成操作生成及安装 用VS打开OpenCV源码 方式一:文件–》打开–》Cmake 找到源码根目录下CMakeLists.txt文件 导入即可。 方式二:在开始使用这里 选择 打开本地文件夹 找到源码的根目录,导入即可…

Spring Boot 如何配置 log4j2

Log4j2 介绍 Spring Boot 中默认使用 Logback 作为日志框架,接下来我们将学习如何在 Spring Boot 中集成与配置 Log4j2。在配置之前,我们需要知道的是 Log4j2 是 Log4j 的升级版,它在 Log4j 的基础上做了诸多改进: 异步日志&…

[NAND Flash 4.1] Flash(闪存)存储器底层原理 | 闪存存储器重要参数

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​全文 5000 字。 从底层物理原理上了解 Nand Flash。 1. 存储器诞生&#xff1a; 现代计算机使用存储器来存储数据&#xff0c;其…

插入排序----希尔排序

希尔排序 希尔排序法又称缩小增量法。希尔排序法的基本思想是&#xff1a;先选定一个整数&#xff0c;把待排序文件中所有记录分成个gap组&#xff0c;所有距离为的记录分在同一组内&#xff0c;并对每一组内的记录进行排序。然后&#xff0c;取&#xff0c;重复上述分组和排序…

QT:Unable to create a debugging engine.

debug跑不了&#xff1a; 报错&#xff1a;Unable to create a debugging engine. 参考&#xff1a; https://blog.csdn.net/u010906468/article/details/104716198 先检查是否安装了DEBUG插件 工具-》》选项 查看插件&#xff0c;如果没有的话&#xff0c;需要重新安装qt时…

JavaScript中的for循环

(for循环): for循环- 语法&#xff1a; for(①初始化表达式;②条件表达式;④更新表达式){ ③语句... } - 执行流程&#xff1a; ① for执行时&#xff0c;会首先执行初始化表达式&#xff0c;来初始化变量 ② 执行条件表达式判断循环是否执行 - 判断结果为false&#xf…

加密的艺术:对称加密的奇妙之处(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

一些关于fMRI脑数据的预处理工具

一些关于fMRI脑数据的预处理工具 前言概述SPM12工具箱FSL工具箱FreeSurfer工具箱BrainNet Viewer工具箱circularGraph工具箱Nipype集成框架fMRIPrep集成框架参考文献 前言 March 25, 2022 这里是关于fMRI脑数据的预处理工具的相关调研 主要是关于数据的预处理&#xff0c;数据…

Windows环境提示“‘mysql‘ 不是内部或外部命令,也不是可运行的程序或批处文理件” 简易记录

在Windows环境下使用DOS命令窗登入MYSQL&#xff0c;提示“mysql 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件。” 这意味着系统无法找到 mysql.exe可执行文件&#xff0c;这是因为 MySQL 没有正确安装或未添加到系统PATH环境变量中所致。 处理方法&#x…

spring-boot-data-jpa、JPA实现负责查询、复杂搜索

spring-boot-data-jpa、JPA实现负责查询、复杂搜索 JPA越来越丰富了&#xff0c;下面使用springboot3.x实现JPA分页 通过传入Example参数实现复杂字段查询 转自 https://lingkang.top/archives/jpa-shi-xian-fu-ze-cha-xun 依赖 <dependency><groupId>org.spring…

分组背包问题笔记

分组背包是选不同的组&#xff0c;每个组中只能选一个物品。分组背包就是01背包的变种&#xff0c;多重背包就是特殊的分组背包。 //分组背包 #include<iostream> using namespace std; const int N 110; int f[N], v[N], w[N], n, m;int main() {ios::sync_with_stdio(…

ShardingSphereJDBC简单入门

ShardingSphere 介绍ShardingSphere-JDBCSharding-Sphere-ProxyShardingSphere-Sidecar混合架构运行模式DistSQL可拔插架构ShardingSphere的发展路线 主从复制ShardingSphere-JDBC功能SQL解析SQL支持程度SQL稳定支持SQL实验性支持 MySQL不支持SQL清单分页 数据分片垂直分片水平…

飞天使-docker知识点9-dockerfile补充

文章目录 dockerfile.dockerignoreMAINTANIERFROMEXPOSEENVCMD dockerfile 里面的文件首字母必须大写 编译的文件必须放在当前目录&#xff0c;不能放在父目录文件配置好了之后&#xff0c;可以使用docker build 命令进行操作.dockerignore 在使用 Dockerfile 进行构建时&…

509.斐波那契数

题目描述 斐波那契数&#xff0c;通常用 F(n) 表示&#xff0c;形成的序列称为斐波那契数列。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - 1) F(n - 2)&#xff0c;其中 n > 1。…

Python 爬虫开发完整环境部署,爬虫核心框架安装

Python 爬虫开发完整环境部署 前言&#xff1a; ​ 关于本篇笔记&#xff0c;参考书籍为 《Python 爬虫开发实战3 》 笔记做出来的一方原因是为了自己对 Python 爬虫加深认知&#xff0c;一方面也想为大家解决在爬虫技术区的一些问题&#xff0c;本篇文章所使用的环境为&#x…

关于Ubuntu22.04恢复误删文件的记录

挂载在Ubuntu22.04下的固态盘有文件被误删了&#xff0c;该固态盘是ntfs格式的。 在网上找了很多教程&#xff0c;最后决定用TestDisk工具进行恢复。 现记录如下&#xff1a; Ubuntu安装testdisk sudo apt-get install testdisk运行testdisk sudo testdisk得到 我选择的是…

Linux文件与目录管理

在Linux系统中&#xff0c;文件和目录是最基本的组织单位。了解如何有效地管理和操作文件和目录对于提高工作效率至关重要。本文将介绍Linux文件与目录管理的基本原理和常用命令&#xff0c;帮助读者掌握Linux系统的文件操作技巧。 一、文件与目录的基本概念 文件&#xff1a…