当前位置: 首页 > news >正文

深度学习项目 -7-使用 Python 的手写数字识别

 一、前言

该文章仅作为个人学习使用

二、正文

项目源代码:深度学习项目 - 使用 Python 进行手写数字识别 - DataFlair (data-flair.training)

数据集:​​​​​​​https://drive.google.com/open?id=1hJiOlxctFH3uL2yTqXU_1f6c0zLr8V_K

Python 深度学习项目

为了让机器更智能,开发人员正在深入研究机器学习和深度学习技术。一个人通过一次又一次地练习和重复任务来学习执行任务,以便记住如何执行任务。然后他大脑中的神经元自动触发,它们可以快速执行他们学到的任务。深度学习也与此非常相似。它使用不同类型的神经网络架构来解决不同类型的问题。例如,物体识别、图像和声音分类、物体检测、图像分割等。

什么是手写数字识别?

手写数字识别是计算机识别人类手写数字的能力。对于机器来说,这是一项艰巨的任务,因为手写数字并不完美,可以制作成许多不同的口味。手写数字识别是这个问题的解决方案,它使用数字的图像并识别图像中存在的数字。

关于 Python 深度学习项目

在本文中,我们将使用 MNIST 数据集实现一个手写数字识别应用程序。我们将使用一种特殊类型的深度神经网络,即卷积神经网络。最后,我们将构建一个 GUI,您可以在其中绘制数字并立即识别它。

先决条件

有趣的 Python 项目需要您具备 Python 编程的基础知识、使用 Keras 库进行深度学习以及用于构建 GUI 的 Tkinter 库。

使用以下命令安装此项目所需的库:

pip 安装 numpy、tensorflow、keras、pillow、

MNIST数据集

这可能是机器学习和深度学习爱好者中最受欢迎的数据集之一。MNIST 数据集包含 60,000 张从 0 到 9 的手写数字训练图像和 10,000 张用于测试的图像。因此,MNIST 数据集有 10 个不同的类。手写数字图像表示为 28×28 矩阵,其中每个单元格都包含灰度像素值。

下载项目的完整源代码

构建基于手写数字识别的Python深度学习项目

以下是实施手写数字识别项目的步骤:

1. 导入库并加载数据集

首先,我们要导入训练模型所需的所有模块。Keras库已经包含了一些数据集,MNIST就是其中之一。因此,我们可以轻松地导入数据集并开始使用它。mnist.load_data() 方法向我们返回训练数据、标签以及测试数据和标签。

导入 Keras
来自Keras。数据集导入 MNIST
来自Keras。模型导入顺序
来自Keras。图层导入 Dense、Dropout、Flatten
来自Keras。图层导入 Conv2D、MaxPooling2D
从 keras 导入后端作为 K
# 数据,在训练集和测试集之间拆分
(x_train, y_trainx_test, y_test = mnist.load_data()
打印x_train.形状,y_train。形状)

2. 预处理数据

图像数据不能直接输入到模型中,因此我们需要执行一些操作并处理数据,以便为我们的神经网络做好准备。训练数据的维度为 (60000,28,28)。CNN 模型将需要一个维度,因此我们将矩阵重塑为 shape (60000,28,28,1)。

x_train = x_train。重塑x_train。形状[0]28281)
x_test = x_test。重塑x_test。形状[0]28281)
input_shape = 28281)
# 将类向量转换为二进制类矩阵
y_train = keras。utilsto_categoricaly_train, num_classes)
y_test = keras。utilsto_categoricaly_test, num_classes)
x_train = x_train。astype'float32')
x_test = x_test。astype'float32')
x_train /= 255
x_test /= 255
print'x_train形状:', x_train.形状)
打印x_train.shape[0]'训练样本')
打印x_test。shape[0]'测试样本')

3. 创建模型

现在,我们将在 Python 数据科学项目中创建 CNN 模型。CNN 模型通常由卷积层和池化层组成。它适用于表示为网格结构的数据,这就是 CNN 在图像分类问题中效果不佳的原因。dropout 层用于停用一些神经元,在训练时,它会减少模型的拟合。然后,我们将使用 Adadelta 优化器编译模型。

batch_size = 128
num_classes = 10
纪元 = 10
model = 顺序()
型。addConv2D32, kernel_size=33,activation='relu',input_shape=input_shape))
型。addConv2D6433, activation='relu'))
型。addMaxPooling2Dpool_size=22)))
型。辍学0.25))
型。添加展平())
型。addDense256, activation='relu'))
型。添加辍学0.5))
model.add(Dense(num_classes, activation='softmax'))
model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=['accuracy'])

4. 训练模型

Keras 的 model.fit() 函数将开始模型的训练。它采用训练数据、验证数据、epoch 和批量大小。

训练模型需要一些时间。训练后,我们将权重和模型定义保存在“mnist.h5”文件中。

hist = 模型。fitx_train, y_train,batch_size=batch_size,epochs=epochs,verbose=1,validation_data=x_test, y_test))
print“模型已成功训练”)
型。保存'mnist.h5')
print“将模型另存为 mnist.h5”)

5. 评估模型

我们的数据集中有 10,000 张图像,这些图像将用于评估我们的模型的工作情况。测试数据没有参与数据的训练,因此,它是我们模型的新数据。MNIST数据集平衡性很好,因此我们可以获得大约99%的准确率。

分数 = 模型。evaluatex_test, y_test, verbose=0)
print'测试损失:', score[0])
print'测试精度:', score[1])

6. 创建 GUI 以预测数字

现在对于 GUI,我们创建了一个新文件,在其中我们构建了一个交互式窗口,用于在画布上绘制数字,并且通过一个按钮,我们可以识别数字。Tkinter 库位于 Python 标准库中。我们创建了一个函数 predict_digit(),它将图像作为输入,然后使用经过训练的模型来预测数字。

然后我们创建 App 类,该类负责为我们的应用程序构建 GUI。我们创建一个画布,可以通过捕获鼠标事件来绘制,并使用一个按钮触发 predict_digit() 函数并显示结果。

以下是我们gui_digit_recognizer.py文件的完整代码:

来自Keras。模型导入load_model
从 tkinter 导入*
将 tkinter 导入为 tk
导入 Win32GUI
从 PIL 导入 ImageGrab, 图像
将 numpy 导入为 np
模型 = load_model'mnist.h5')
定义 predict_digitimg
#resize 图像到 28x28 像素
img = img。调整大小((28,28))
#convert RGB 到灰度
img = img。convert'L')
img = np。阵列img)
#reshaping 支持我们的模型输入和归一化
img = img。重塑1,28,28,1 )
img = img/255.0
#predicting 课程
res = 模型。预测([img])[0]
返回 NP。argmaxresmaxres)
Apptk.Tk
def __init__个体经营)
传统知识。Tk__init__自行)
自我。x = 自我。y = 0
# 创建元素
自我。帆布 = TK。Canvasself, width=300, height=300, bg = “白色”, cursor=“cross”)
自我。标签 = TK。Labelself, text=“思考..”, font=“Helvetica”48))
自我。classify_btn = 传统知识。Buttonself, text = “识别”, command = self.classify_handwriting)
自我。button_clear = TK。Buttonself, text = “清除”, command = self.clear_all)
# 网格结构
自我。帆布gridrow=0, column=0, pady=2, sticky=W, )
自我。标签gridrow=0, column=1,pady=2, padx=2)
自我。classify_btn.gridrow=1, column=1, pady=2, padx=2)
自我。button_clear.gridrow=1, column=0, pady=2)
#self.canvas.bind(“<运动>”, self.start_pos)
自我。帆布bind“<B1-Motion>”, 自身。draw_lines)
def clear_all个体经营)
自我。帆布delete“全部”)
def classify_handwriting个体经营)
HWND = 自身。帆布winfo_id() # 获取画布的手柄
矩形 = Win32GUI。GetWindowRectHWND # 获取画布的坐标
im = 图像抓取。抓取矩形)
数字,acc = predict_digitim)
自我。标签configuretext= strdigit+', '+ strintacc*100))+'%')
def draw_linesself, event
自我。x = 事件。
自我。y = 事件。y
r=8
自我。帆布create_oval自。X-R, 自身。Y-R, 自我。x + r, 自我。y + r, fill='黑色')
app = 应用()
主环路()

截图:

三、总结

在本文中,成功地在手写数字识别应用程序上构建了一个 Python 深度学习项目。已经构建并训练了卷积神经网络,该网络对于图像分类目的非常有效。稍后,我们构建 GUI,在画布上绘制一个数字,然后对数字进行分类并显示结果。

相关文章:

深度学习项目 -7-使用 Python 的手写数字识别

一、前言 该文章仅作为个人学习使用 二、正文 项目源代码&#xff1a;深度学习项目 - 使用 Python 进行手写数字识别 - DataFlair (data-flair.training) 数据集&#xff1a;​​​​​​​https://drive.google.com/open?id1hJiOlxctFH3uL2yTqXU_1f6c0zLr8V_K Python 深…...

MySQL —— 库,数据类型 与 表

库与基础操作 1.1 查看数据库 使用 show databases; 可以查看当前 MySQL 目前有多少个数据库 5 rows 表示有 5 行&#xff0c;这里是表示的是有效的数据&#xff0c;不包括 第一行的指引 set 表示结果集合 0.01 sec 表示这个 sql 语句一共运行了0.01 秒&#xff0c;一般情况…...

Java重修笔记 第二十七天 匿名内部类

匿名内部类 1. 定义&#xff1a;无类名&#xff08;底层自动分配类名“外部类名$1”&#xff09;&#xff0c;既是类也是对象&#xff0c;定义在外部类的局部位置&#xff0c;例如方法体和代码块中&#xff0c;通过new类或接口并在大括号里重写方法来实现。 2. 使用场景&…...

Nero Lens 智图 - 适用于 iOS 和 iPadOS 的专业图片处理 App

首先是手机端的无损放大 App&#xff1a;Nero Lens 智图&#xff0c;适用于 iOS 和 iPadOS&#xff0c;不仅可以放大&#xff0c;还有多种 AI 图片增强功能。 使用这款 App 可以通过 AI 模型智能放大可达 400%&#xff0c;还有老照片去划痕、上色&#xff0c;抠图移除背景、照…...

Nginx代理路径被吃

Nginx代理路径被吃的情况 日常工作中经常使用nginx反向代理一些资源&#xff0c;有时正常代理&#xff0c;发现代理不过去。 验证被吃调location情况 通过浏览器访问&#xff1a; https://zhao138969.com/LinuxPackage/Python/SelectDocker location /LinuxPackage { proxy…...

pytest-html报告修改与汉化

前言 Pytest框架可以使用两种测试报告&#xff0c;其中一种就是使用pytest-html插件生成的测试报告&#xff0c;但是报告中有一些信息没有什么用途或者显示的不太好看&#xff0c;还有一些我们想要在报告中展示的信息却没有&#xff0c;最近又有人问我pytest-html生成的报告&a…...

react-native从入门到实战系列教程一Swiper组件的使用及bug修复

轮播图&#xff0c;在app中随处可见&#xff0c;这么重要的功能我们怎么可能不学习下在react-native中的实现方式。 依然是第三方组件react-native-swiper 官网地址 https://www.npmjs.com/package/react-native-swiper 组件使用的组件及事件参考官方即可。 实现效果 官网…...

springboot开发的常用注解总结-配置组件类注解

Spring Boot 提供了许多注解&#xff0c;这些注解大大简化了 Spring 应用的配置和开发过程。以下是一些常见的 Spring Boot注解及其作用。 目录 配置组件类 &#xff08;Configure Component &#xff09;Configuration解释&#xff1a;Demo Code&#xff1a;更深度使用&#x…...

DataX 最新版本安装部署

1、下载 git clone gitgithub.com:alibaba/DataX.git 2、打包 mvn -U clean package assembly:assembly -Dmaven.test.skiptrue...

【架构】应用保护

这篇文章总结一下应用保护的手段。如今说到应用保护&#xff0c;更多的会想到阿里的sentinel&#xff0c;手段丰富&#xff0c;应用简单。sentinel的限流、降级、熔断&#xff0c;可以自己去试一下&#xff0c;sentinel主要通过配置实现功能&#xff0c;不难。sentinel的简介放…...

从核心到边界:六边形、洋葱与COLA架构的深度解析

文章目录 1 引言2 软件架构3 架构分类4 典型的应用架构4.1 分层架构4.2 CQRS4.3 六边形架构4.4 洋葱架构4.5 DDD 5 COLA架构设计5.1 分层设计5.2 扩展设计5.3 规范设计5.3.1 组件规范5.3.2 包规范5.3.3 命名规范 6 COLA架构总览7 小结 1 引言 软件的首要技术使命&#xff1a;管…...

04-Fastjson反序列化漏洞

免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担&…...

ABC365(A-D)未补

A - Leap Year&#xff08;模拟&#xff09; 题意&#xff1a;给定一个数字n&#xff0c;如果n不是4的倍数&#xff0c;输出365&#xff1b;如果n是4的倍数但不是100的倍数&#xff0c;输出366&#xff1b;如果n是100的倍数但不是400的倍数&#xff0c;输出365&#xff1b;如果…...

Python用png生成不同尺寸的图标

Kimi生成 from PIL import Imagedef generate_icon(source_image_path, output_image_path, size):with Image.open(source_image_path) as img:# 转换图片为RGBA模式&#xff0c;确保有透明通道if img.mode ! RGBA:img img.convert(RGBA)# 调整图片大小到指定尺寸img img.r…...

1688中国站获得工厂档案信息 API

公共参数 名称类型必须描述keyString是免费申请调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_get,item_search_shop等]cacheString否[yes,no]默认y…...

定时任务框架 xxl-job

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…...

C/C++关键字大全

目录 一、const 二、static 三、#define 和 typedef 四、#define 和 inline 五、#define 和 const 六、new 和 malloc 七、const 和 constexpr 八、volatile 九、extern 十、前置 和后置 十一、atomic 十二、struct 和 class 一、const 1、const 关键字可用于定义…...

ROS2 Linux Mint 22 安装教程

前言&#xff1a; 本教程在Linux系统上使用。 一、linux安装 移动硬盘安装linux&#xff1a;[LinuxToGo教程]把ubuntu装进移动固态&#xff0c;随时随用以下是我建议安装linux mint版本的清单&#xff1a; 图吧工具箱&#xff1a;https://www.tbtool.cn/linux mint: https://…...

快速将网站从HTTP升级为HTTPS

在当今数字化的世界中&#xff0c;网络安全变的越来越重要&#xff0c;HTTPS&#xff08;超文本传输安全协议&#xff09;不仅能够提供加密的数据传输&#xff0c;还能增强用户信任度&#xff0c;提升搜索引擎排名&#xff0c;为网站带来多重益处。所以将网站从HTTP升级到HTTPS…...

Qt程序移植至Arm开发板

目录 1.工具准备&#xff1a; 系统调试工具SecureCRT 虚拟机安装linux&#xff08;Ubuntu) 交叉编译工具链 ARM 端Qt 环境(Qt-5.7.1) 1) linux processor SD安装 2&#xff09;交叉编译工具链配置 2.编译Qt工程&#xff1a; 2.0 交叉编译 依赖库源码&#xff0c;生成动…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

论文笔记——相干体技术在裂缝预测中的应用研究

目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术&#xff1a;基于互相关的相干体技术&#xff08;Correlation&#xff09;第二代相干体技术&#xff1a;基于相似的相干体技术&#xff08;Semblance&#xff09;基于多道相似的相干体…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...