基于卷积神经网络模型的手写数字识别

基于卷积神经网络模型的手写数字识别

  • 一. 前言
  • 二. 设计目的及任务描述
    • 2.1 设计目的
    • 2.2 设计任务
  • 三. 神经网络模型
    • 3.1 卷积神经网络模型方案
    • 3.2 卷积神经网络模型训练过程
    • 3.3 卷积神经网络模型测试
  • 四. 程序设计

一. 前言

手写数字识别要求利用MNIST数据集里的70000张手写体数字的图像,建立神经网络模型,进行0到9的分类,并能够对其他来源的图片进行识别,识别准确率大于97%。图片示例如下。
alt

图1-1 mnist数据集图片示例

该设计要求学生基于TensorFlow深度学习平台,利用自动下载的MNIST数据集,建立全连接或者CNN神经网络模型,对MNIST或者其他图片中的数字进行正确识别。同时,在数据获取、处理和分析过程中考虑数据安全、技术经济、工程伦理、行业规范等要素。

通过该题目的训练,使学生对深度学习技术有一定的了解,掌握深度学习模型建立、训练、测试和调优的过程,理解监督学习、数据处理、神经网络、卷积计算等概念并通过实例进行实践,学习TensorFlow并搭建深度学习平台,加深学生对深度学习技术的理解和实际引用,并能够利用深度学习方法解决实际问题。

二. 设计目的及任务描述

2.1 设计目的

深入学习TensorFlow深度学习平台,通过构建全连接神经网络和卷积神经网络的手写数字识别模型,实现对MNIST数据集中的数字0到9的分类,并具备对其他来源的图片进行准确识别的能力,要求识别准确率大于97%。这一设计旨在深入理解深度学习技术,并掌握模型的建立、训练、测试和调优的全过程。

首先,进行文献资料查阅,至少阅读5篇相关文献,以确保对深度学习领域的最新进展有所了解。通过文献的学习,将为设计过程提供前沿的理论支持,在实践中融入最新的研究成果。

学习TensorFlow深度学习平台的搭建是课程设计的第二步,这将提供一个强大而灵活的工具,用以实现神经网络的建模和训练。通过掌握TensorFlow,学生将具备在深度学习领域进行实际工作的基本能力。

建立卷积神经网络(CNN),理解卷积运算的原理和图像特征提取的过程。通过建立卷积神经网络的手写数字识别模型,深刻体会卷积计算和最大池化运算对图像特征提取的重要性。学习率、衰减率等参数的调整将是设计中的一个重要环节,通过调优模型,探索不同参数组合对模型性能的影响,并提高识别准确率。

通过这个课程设计,不仅获得深度学习技术的实际应用经验,还将培养文献查阅、团队协作、数据伦理等方面的能力,为将来深入科研或产业实践打下坚实基础。

2.2 设计任务

  1. 查阅文献资料,一般在5篇以上;
  2. 学习TensorFlow深度学习平台的搭建。
  3. 学习卷积神经网络,理解卷积运算原理,建立卷积网络的手写数字识别模型,并进行模型训练、测试和调优。
  4. 理解卷积计算后的最大池化运算,学习图像特征提取的原理。
  5. 理解学习率、衰减率等参数的作用。
  6. 理解监督学习的过程。
  7. 学习损失率函数构建方法。
  8. 经过模型调优,理解模型中各参数的作用以及影响模型准确率的因素。
  9. 模型识别准确率大于97%。
  10. 撰写课程设计说明书,须达到以下要求:
    (1) 陈述设计题目、设计任务;
    (2) 描述TensorFlow深度学习平台的搭建过程;
    (3) 写出卷积神经网络模型方案;
    (4) 记录卷积神经网络模型训练过程;
    (5) 记录卷积神经网络模型测试准确率;
    (6) 陈述模型调优过程,包括调优过程中遇到的主要问题,是如何解决的;对模型设计和编码的回顾、反思和体会等,与同学对问题的讨论、分析、改进设想以及收获等。同时,分析数据处理及分析过程中面临的数据安全、工程伦理等问题。

三. 神经网络模型

3.1 卷积神经网络模型方案

卷积神经网络(CNN)在计算机视觉领域已成为极其成功的深度学习模型典范,本模型设计即采纳了经典的LeNet-5架构风格。

在开始模型训练之前,首先加载MNIST手写数字数据集,并对数据进行了细致的预处理。所有图像被统一调整为28x28像素大小,以确保输入的一致性。同时,为了提升模型的训练稳定性和效果,对图像数据进行归一化,将像素值限定在[0, 1]的范围内。对于标签数据,采用了独热编码方式,以便于多分类任务的处理。

在模型编译阶段,选择交叉熵损失函数来衡量预测与真实标签之间的差异,为了进一步优化训练过程,引入了学习率衰减策略,使模型能够在训练的不同阶段灵活地调整学习步长。

该神经网络模型结构严谨,功能明确。它起始于卷积层,其中第一层利用6个5x5大小的卷积核来捕捉图像的初级特征,并通过ReLU激活函数为网络引入非线性特性。最大池化层以2x2的窗口对特征图进行下采样,有效降低了数据的空间维度,同时保留了重要特征。第二层卷积层进一步扩展了特征提取的深度,使用了16个5x5的卷积核,并再次应用ReLU激活函数。这一层级的特征在经过第二个最大池化层的下采样后,被进一步抽象和压缩。

在展平层,模型将经过卷积和池化处理的二维特征图转换为一维特征向量,为后续的全连接层做好了数据准备。全连接层作为模型的决策核心,第一层包含120个神经元,第二层包含84个神经元,均使用ReLU激活函数以增强网络的表达能力。

输出层配备了10个神经元,每个神经元对应着数字0到9的一个类别。通过Softmax激活函数,模型能够输出各个类别的概率分布,从而实现多类别分类任务。整个模型的设计巧妙地结合了卷积、池化和全连接操作,实现了从原始图像到最终分类结果的精确映射。

3.2 卷积神经网络模型训练过程

通过对训练集进行多轮迭代,模型不断学习特征并调整权重,以最小化损失函数。在训练过程中,监视模型在验证集上的性能,以及损失和准确率的变化。
在这里插入图片描述

图 3-1 卷积神经网络模型_训练结果
如图3-1所示,通过5次训练模型的准确度达到99%。

3.3 卷积神经网络模型测试

使用 Keras 模型的 evaluate 方法在测试集上进行评估。
在这里插入图片描述

图 3-2 卷积神经网络模型_测试结果
经测试,如图3-2所示,模型准确度为99.19%。

四. 程序设计

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten, Conv2D, MaxPooling2D
from tensorflow.keras.datasets import mnist
from IPython import get_ipython
from tensorflow.keras.optimizers import Adamdef load_and_preprocess_data():# 加载并预处理MNIST数据集(x_train, y_train), (x_test, y_test) = mnist.load_data()# 重塑和归一化数据x_train = x_train.reshape((x_train.shape[0], 28, 28, 1)) / 255.0x_test = x_test.reshape((x_test.shape[0], 28, 28, 1)) / 255.0# 对标签进行多分类编码num_categories = 10y_train = tf.keras.utils.to_categorical(y_train, num_categories)y_test = tf.keras.utils.to_categorical(y_test, num_categories)return x_train, y_train, x_test, y_testdef build_model_Convolutional():#*# 构建卷积神经网络模型model = Sequential()model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))model.add(MaxPooling2D((2, 2)))model.add(Conv2D(64, (3, 3), activation='relu'))model.add(MaxPooling2D((2, 2)))model.add(Flatten())model.add(Dense(512, activation='relu'))model.add(Dense(10, activation='softmax'))model.summary()return modeldef compile_and_train_model(model, x_train, y_train, x_test, y_test):# 自定义优化器,设置学习率和衰减率custom_optimizer = Adam(learning_rate=0.001, decay=1e-6)# 编译并训练模型model.compile(optimizer='Adam', loss='categorical_crossentropy', metrics=['accuracy'])history = model.fit(x_train, y_train, epochs=10, verbose=1, validation_data=(x_test, y_test))return historydef shutdown_ipython_kernel():# 清理显存ipython = get_ipython()if ipython:ipython.kernel.shutdown()if __name__ == "__main__":# 加载并预处理数据x_train, y_train, x_test, y_test = load_and_preprocess_data()# 构建神经网络模型model = build_model_Convolutional()# 编译并训练模型history = compile_and_train_model(model, x_train, y_train, x_test, y_test)# 保存训练模型model.save("mnist_cnn_model.h5")print("Model saved successfully.")# 清理显存shutdown_ipython_kernel()

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

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

相关文章

2024/2/7总结

Node.js 什么是node.js node.js是一个基于chrome v8 引擎的 JavaScript 运行环境。 浏览器是JavaScript的前端运行环境node.js是JavaScript的后端运行环境 node.js中无法调用DOM和BOM等浏览器内置API fs模块 是node.js官方提供的、用来操作文件的模块,它提供了一系…

Redis篇之集群

一、主从复制 1.实现主从作用 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。主节点用来写的操作,从节点用来读操作,并且主节点发生写操作后,会把数据同…

FlinkSql通用调优策略

历史文章迁移,稍后整理 使用DataGenerator 提前进行压测,了解数据的处理瓶颈、性能测试和消费能力 开启minibatch:"table.exec.mini-batch.enabled", "true" 开启LocalGlobal 两阶段聚合:"table.exec.m…

DAC调节DCDC输出电压的电路方案分析

BUCK型电源芯片的调压方式分析 1、前题 BUCK型的电源芯片非常多,常用的如LM2576、LM2596等等,这种芯片优点很多,比如功率大、体积小、效率高等。这种芯片一般都可以通过电阻分压的方式设定反馈脚VFB的电压来改变电源芯片的输出电压。但最近…

mac电脑安装cocoapods出错,以及安装最新版本ruby方法

macbook安装cocoapods时碰到一个报错:大概率是ruby的版本太低导致的 sudo gem install cocoapods ERROR: Error installing cocoapods: ERROR: Failed to build gem native extension. ... Could not create Makefile due to some reason, probably lack of neces…

nginx登录用户验证配置

我们的nginx端口一般都是对外开放的,所以有一定程度上有被别人扫描的风险,所以为了减少被扫描的风险,我们可以配置一个nginx的用户登录验证; 用户验证登录需要nginx的一个模块:ngx_http_auth_basic_module 我们使用…

消息中间件之RocketMQ源码分析(八)

RocketMQ中的消息过滤 RocketMQ设计了消息过滤,来解决大量无意义流量的传输:即对于客户端不需要的消息, Broker就不会传输给客户端,以免浪费宽带,RocketMQ4.2.0支持Tag过滤、SQL92过滤、Filter Server过滤 Tag过滤 第一步:用户发…

【状态管理一】概览:状态使用、状态分类、状态具体使用

文章目录 一. 状态使用概览二. 状态的数据类型1. 算子层面2. 接口层面2.1. UML与所有状态类型介绍2.2. 内部状态:InternalKvState 将知识与实际的应用场景、设计背景关联起来,这是学以致用、刨根问底知识的一种直接方式。 本文介绍 状态数据管理&#x…

postman执行批量测试

1.背景 有许多的人常常需要使用第三方系统进行重复的数据查询,本文介绍使用PostMan的方式对数据进行批量的查询,减少重复的劳动。 2.工具下载 3.初入门 一、如图示进行点击,创建collection 二、输入对应的名称 三、创建Request并进行查…

设计模式理解:单例模式+工厂模式+建设者模式+原型模式

迪米特法则:Law of Demeter, LoD, 最少知识原则LKP 如果两个软件实体无须直接通信,那么就不应当发生直接的相互调用,可以通过第三方转发该调用。其目的是降低类之间的耦合度,提高模块的相对独立性。 所以,在运用迪米特…

【Git版本控制 02】分支管理

目录 一、创建分支 二、切换分支 三、合并分支 四、删除分支 五、合并冲突 六、分支策略 七、bug分支 一、创建分支 # 当前仓库只有 master 一个主分支 # 可通过 git branch 是进行分支管理的命令,可通过不同参数对分支进行查看、创建、删除(base) [rootloc…

Open CASCADE学习|放样

在CAD(计算机辅助设计)建模中,放样是一种重要的技术,用于将二维图形或设计转化为三维模型。通过放样,设计师可以根据一系列二维剖面和一个或多个引导路径创建出复杂的三维形状。 CAD建模放样的基本步骤如下&#xff1…