当前位置: 首页 > 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;生成动…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数

高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数 在软件开发中,单例模式(Singleton Pattern)是一种常见的设计模式,确保一个类仅有一个实例,并提供一个全局访问点。在多线程环境下,实现单例模式时需要注意线程安全问题,以防止多个线程同时创建实例,导致…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...