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

⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/

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

  • 基于卷积神经网络的手写数字识别
    • 一、任务需求
    • 二、任务目标
          • 1、掌握神经网络的卷积操作
          • 2、掌握卷积神经网络的分层
          • 3、掌握卷积层的参数及配置
          • 4、掌握池化层的参数及配置
    • 三、任务环境
          • 1、jupyter开发环境
          • 2、python3.6
          • 3、tensorflow2.4
    • 四、任务实施过程
        • (一)、数据集查看
        • (二)、卷积神经网络构建
        • (三)、卷积神经网络训练与评估
    • 五、任务小结

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


一、任务需求

我们这里要解决的问题是,将手写数字的灰度图像(28 像素×28 像素)划分到10个类别中(0~9)。我们将使用 MNIST 数据集,它是机器学习领域的一个经典数据集,这个数据集包含60000张训练图像和10000张测试图像,由美国国家标准与技术研究院在20世纪 80年代收集得到。我们先来看一个简单的卷积神经网络示例,即使用卷积神经网络对MNIST数字进行分类,这个任务我们在前面章节使用全连接网络做过。虽然本例中的卷积神经网络很简单,但其精度肯定会超过前面章节的全连接网络。

下列代码将会展示一个简单的卷积神经网络。它是 Conv2D 层和MaxPooling2D层的堆叠。

卷积神经网络接收形状为 (image_height, image_width, image_channels)的输入张量(不包括批量维度)。本例中设置卷积神经网络处理大小为 (28, 28, 1) 的输入张量,这正是 MNIST 图像的格式。我们向第一层传入参数 input_shape=(28, 28, 1) 来完成此设置。

二、任务目标

1、掌握神经网络的卷积操作
2、掌握卷积神经网络的分层
3、掌握卷积层的参数及配置
4、掌握池化层的参数及配置

三、任务环境

1、jupyter开发环境
2、python3.6
3、tensorflow2.4

四、任务实施过程

(一)、数据集查看

1、导入相关类库,划分训练集和测试集

import tensorflow.keras
from tensorflow.keras.datasets import mnist
from matplotlib import pyplot as plt
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
#train_images 和 train_labels 组成了训练集(training set),模型将从这些数据中进行学习。
#然后在测试集(test set,即 test_images 和 test_labels)上对模型进行测试。

train_images 和 train_labels 组成了训练集(training set),模型将从这些数据中进行学习。然后在测试集(test set,即 test_images 和 test_labels)上对模型进行测试。

图像被编码为 Numpy 数组,而标签是数字数组,取值范围为 0~9。图像和标签一一对应。

2、可视化训练集输入特征的第一个元素

plt.imshow(train_images[0])  # 绘制图片
plt.show()

在这里插入图片描述

3、查看训练数据的特征维度和标签数量

train_images.shape

在这里插入图片描述

len(train_labels)

在这里插入图片描述
4、查看训练数据的标签

train_labels

在这里插入图片描述

5、查看测试数据的特征维度和标签数量

len(test_labels)

在这里插入图片描述

6、查看测试数据的标签

test_labels

在这里插入图片描述

(二)、卷积神经网络构建

接下来的工作流程如下:

首先,将训练数据(train_images 和 train_labels)输入神经网络;

其次,网络学习将图像和标签关联在一起;

最后,网络对 test_images 生成预测, 查看网络模型的指标。

1、我们来构建网络。

from tensorflow.keras import layers
from tensorflow.keras import models
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))

2、查看目前卷积神经网络的架构。

model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 26, 26, 32)        320       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 11, 11, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64)          0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 3, 3, 64)          36928     
=================================================================
Total params: 55,744
Trainable params: 55,744
Non-trainable params: 0
_________________________________________________________________

可以看到,每个 Conv2D 层和 MaxPooling2D 层的输出都是一个形状为 (height, width,channels) 的 3D 张量。宽度和高度两个维度的尺寸通常会随着网络加深而变小。通道数量由传入 Conv2D 层的第一个参数所控制(32 或 64)。

3、下一步是将最后的输出张量[大小为 (3, 3, 64)]输入到一个密集连接分类器网络中, 即 Dense 层的堆叠。这些分类器可以处理 1D 向量,而当前的输出是 3D 张量。 首先,我们需要将 3D 输出展平为 1D,然后在上面添加几个 Dense 层。

model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

4、我们将进行 10 类别分类,最后一层使用带 10 个输出的 softmax 激活。现在网络的架构如下。

model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 26, 26, 32)        320       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 32)        0         
_________________________________________________________________
conv2d_1 (Conv2D)            (None, 11, 11, 64)        18496     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64)          0         
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 3, 3, 64)          36928     
_________________________________________________________________
flatten (Flatten)            (None, 576)               0         
_________________________________________________________________
dense (Dense)                (None, 64)                36928     
_________________________________________________________________
dense_1 (Dense)              (None, 10)                650       
=================================================================
Total params: 93,322
Trainable params: 93,322
Non-trainable params: 0
_________________________________________________________________

在进入两个 Dense 层之前,形状 (3, 3, 64) 的输出被展平为形状 (576,) 的 向量。

(三)、卷积神经网络训练与评估

1、我们在 MNIST 数字图像上训练这个卷积神经网络。

from tensorflow.keras.utils import to_categorical
train_images = train_images.reshape((60000, 28, 28, 1))
train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28, 28, 1))
test_images = test_images.astype('float32') / 255
train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

model.compile(optimizer='rmsprop',
              loss='categorical_crossentropy',
              metrics=['accuracy'])
history=model.fit(train_images, train_labels, epochs=5, batch_size=64)

在这里插入图片描述

训练过程中显示了两个数字:一个是网络在训练数据上的损失(loss),另一个是网络在训练数据上的精度(acc)。
我们很快就在训练数据上达到了 0.994(99.4%)的精度。

2、现在我们来检查一下模型在测试集上的性能。

test_loss, test_acc = model.evaluate(test_images, test_labels)

在这里插入图片描述

print('test_acc:', test_acc)

在这里插入图片描述

全连接网络的测试精度为 97.8%,但这个简单卷积神经网络的测试精度达到了99.4%,我们将错误率降低了 68%(相对比例)。

五、任务小结

本任务通过卷积神经网络完成了我们在以前章节做过的手写数字识别实验。我们可以看到使用卷积神经网络后,相对于
全连接的神经网络精度提高、错误率降低。展现了卷积神经网络的强大威力。通过本任务需要掌握卷积神经网络的模型构建过程、卷积神经网络的分层结构和测试过程。

–end–

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海外短剧:跨文化的新浪潮与看剧系统的搭建,海外短剧系统搭建开发定制

在全球化的大潮下,海外短剧作为一种新兴的文化交流方式,正逐渐受到越来越多人的喜爱。这种融合了各地文化元素、叙事手法新颖独特的短剧形式,不仅丰富了观众的视觉体验,也为影视媒体和想拓展海外市场的企业带来了无限商机。 一、…

MMSeg分析Flops和Params

Flops计算量,params参数量 在文件中 tools/analysis_tools/get_flops.py利用以下命令实现 python tools/analysis_tools/get_flops.py configs/xxx/xxx-Net.py后面可跟参数shape控制输入图片尺寸,例如 python tools/analysis_tools/get_flops.py conf…

Python Django框架的内容管理系统库之wagtail使用详解

概要 Python Wagtail库是一个基于Django框架的内容管理系统(CMS),它提供了丰富的功能和工具,帮助开发者快速构建灵活、强大的网站和应用。本文将介绍如何安装和使用Python Wagtail库,以及它的特性、基本功能、高级功能、实际应用场景和总结部分。 安装 首先,需要安装Py…

uni-app HBuilderX通过easycom省略import自动导入自定义组件

快速尝试 自HBuilderX 2.5.5起支持easycom组件模式。更新HBuilderX即可尝试。 easycom默认已启用,并对项目下的components和uni_modules目录开启自动扫描,对符合下面路径和命名规则的组件自动导入。 components/组件名/组件名.vue uni_modules/组件名/…

Go并发安全,锁和原子操作

一. 并发安全 有时候在Go代码中可能存在多个goroutine同时操作一个资源(临界区),这种情况会发生竞态问题(数据竞态)。 1.1 互斥锁 互斥锁是一种常见的控制共享资源访问的方法,它能够保证同时只有一个goroutine可以访问共享资源。Go语言中使用sync包的Mut…

【日志】CSDN-AI助手升级日志

CSDN-AI助手升级日志 2023/04/05上线 支持点赞、收藏回访 关注回访(对方至少有一条博客的记录) 评论回访 私信检测到群发消息自动三连 OR 通过私信指令三连触发 bug优化 优化检测模式,防止出现多触发情况 为了防止操作额度不够&#xff0c…

Spring日志

Spring日志的作用: 1.定位和发现问题 2.系统监控 3.数据采集 4.日志审计 打印日志步骤: 1.定义日志对象2.打印日志 RestController public class LoggerController {private static Logger logger LoggerFactory.getLogger(LoggerController.class);PostConstructpublic v…

Dos慢速攻击

这里写自定义目录标题 Dos慢速攻击 Dos慢速攻击 测试结果为“Exit status: No open connections left",代表无此漏洞。 如果测试结束后connected数量较多,closed数量很少或0,说明之前建立的慢速攻击测试连接没有关闭&#…

最佳三款员工电脑行为监控软件评选

企业对员工生产力和数据安全的关注不断增加,员工电脑行为监控软件成为了许多企业不可或缺的工具。 这些软件不仅可以帮助企业管理者实时监测员工的电脑使用情况,还可以防止数据泄露和滥用公司资源。 然而,市面上有数不胜数的员工电脑行为监控…

【前端缓存】localStorage是同步还是异步的?为什么?

写在开头 点赞 收藏 学会 首先明确一点,localStorage是同步的 一、首先为什么会有这样的问题 localStorage 是 Web Storage API 的一部分,它提供了一种存储键值对的机制。localStorage 的数据是持久存储在用户的硬盘上的,而不是内存。这意…

海外盲盒APP开发:探索海外盲盒市场的商机

随着娱乐消费的流行,盲盒在我国可以说是非常火热,消费群体和市场规模逐年增加。在盲盒热潮下,不少潮玩企业也纷纷加入到了盲盒赛道中,市场竞争非常激烈! 此外,我国盲盒出海也成为了一个大趋势。盲盒不仅在…

如何用 Llama 3 免费本地 AI 分析数据和可视化?

帮助你消除调用大模型 API 带来的数据安全烦恼。 模型 今天我们来探讨一个有趣的话题 —— 如何使用 Llama 3 免费地进行数据分析和可视化。 Meta 团队在 2024 年 4 月发布了两款 Llama 3 新模型,一款是 8B,即 80 亿参数;另一款则是 70B&…

鸿蒙arkui 也支持热重载了 我不允许你不会

历史背景 因为鸿蒙出的ark ui 很多人说很像flutter,但是能不能做到跟flutter一样支持热重载呢 。答案是可以的 我们喜就教大家如何操作。 构建工程 选择这个空的模版 next finish 点击file 找到setting 找到 Tools Actions on Save 我们把 Perform hor reload 勾上…

说说你对二分查找的理解?如何实现?应用场景?

一、是什么 在计算机科学中,二分查找算法,也称折半搜索算法,是一种在有序数组中查找某一特定元素的搜索算法 想要应用二分查找法,则这一堆数应有如下特性: 存储在数组中有序排序 搜索过程从数组的中间元素开始&…

招商画册不会制作?这个教程收藏好

在制作招商画册过程中可能对于一些小型企业或刚刚起步的企业来说,招商画册的制作也不是一个难以克服的难题。本文将为您提供一些制作招商画册的技巧和建议。在制作招商画册前肯定是需要选择一款合适的在线制作工具,如FLBOOK 这个平台本就有海量的模板和设…

vue快速入门(四十四)自定义组件

注释很详细,直接上代码 上一篇 新增内容 全局注册自定义组件并应用局部注册自定义组件并应用 此篇使用了axios模块没有安装导入的先看这一篇 axios模块下载与导入 源码 main.js import Vue from vue import App from ./App.vue//全局引入axios // 引入axios impor…

超市火灾烟雾蔓延及人员疏散的matlab模拟仿真,带GUI界面

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 出口在人员的视野范围内时,该元胞选择朝向引导点的方向运动。出口不在人员的视野范围内时,作随机运动,8个方向的运动概率相等。…

网工交换基础——Qinq技术

一、Qinq的概述 QinQ(802.1Q-in-802.1Q),也叫做VLAN Stacking或Double VLAN,由IEEE 802.1ad标准定义,是一项扩展VLAN空间的技术,通过在802.1Q标签报文的基础上再增加一层802.1Q的Tag来达到扩展VLAN空间的目…

Linux驱动开发——(六)按键中断实验

目录 一、简介 二、修改设备树 2.1 添加pinctrl节点 2.2 添加KEY设备节点 2.3 检查是否被其他外设使用 三、代码 3.1 驱动代码 3.2 测试代码 3.3 平台测试 一、简介 以I.MX6U-MINI为例,实现KEY0按下后,设备识别到并将数据发送到平台。 二、修…

40-数组 _ 数组越界

40-1 数组的下标是有范围限制的 数组的下标规定是从0开始的,如果数组有n个元素,最后一个元素的下标就是n-1。所以数组的下标如果小于0,或者大于n-1,就是数组越界访问了,超出了数组合法空间的访问。 C语言本身不做数组…