【机器学习实战入门项目】MNIST数字分类机器学习项目

在这里插入图片描述
Python 深度学习项目:手写数字识别

为了使机器更加智能,开发者们正在深入研究机器学习和深度学习技术。人类通过不断练习和重复来学习执行某项任务,从而记住如何完成这些任务。然后,大脑中的神经元会自动触发,他们能够快速执行已经学到的任务。深度学习与此也非常相似。它使用不同类型的神经网络架构来解决不同类型的问题,例如——对象识别、图像和声音分类、对象检测、图像分割等。

什么是手写数字识别?

手写数字识别是指计算机识别手写数字的能力。这是一项对机器来说较为困难的任务,因为手写数字并不完美,可能有许多不同的书写风格。手写数字识别为这个问题提供了解决方案,它使用数字的图像来识别图像中的数字。

关于 Python 深度学习项目

在本文中,我们将使用 MNIST 数据集实现一个手写数字识别应用程序。我们将使用一种特殊的深度神经网络,即卷积神经网络(Convolutional Neural Networks)。最终,我们将构建一个 GUI,你可以在这个界面上绘制数字,并立即识别它们。

预备知识

这个有趣的 Python 项目要求你具备 Python 编程的基本知识、使用 Keras 库的深度学习知识,以及使用 Tkinter 库构建 GUI 的知识。

安装必要的库

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

pip install numpy, tensorflow, keras, pillow
MNIST 数据集

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

下载项目的完整源代码
实现手写数字识别项目

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

  1. 导入库并加载数据集

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

    import keras
    from keras.datasets import mnist
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Flatten
    from keras.layers import Conv2D, MaxPooling2D
    from keras import backend as K
    # 训练和测试数据集
    (x_train, y_train), (x_test, y_test) = mnist.load_data()
    print(x_train.shape, y_train.shape)
    
  2. 预处理数据

    图像数据不能直接输入到模型中,因此我们需要执行一些操作来处理数据,使其准备好用于我们的神经网络。训练数据的维度是 (60000,28,28)。CNN 模型需要一个额外的维度,因此我们将矩阵重塑为 (60000,28,28,1) 的形状。

    x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
    x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
    input_shape = (28, 28, 1)
    # 将类向量转换为二进制类矩阵
    y_train = keras.utils.to_categorical(y_train, num_classes)
    y_test = keras.utils.to_categorical(y_test, num_classes)
    x_train = x_train.astype('float32')
    x_test = x_test.astype('float32')
    x_train /= 255
    x_test /= 255
    print('x_train shape:', x_train.shape)
    print(x_train.shape[0], '训练样本')
    print(x_test.shape[0], '测试样本')
    
  3. 创建模型

    现在我们将在这个 Python 数据科学项目中创建我们的 CNN 模型。CNN 模型通常包含卷积层和池化层。它在处理以网格结构表示的数据时效果更好,这也是为什么 CNN 用于图像分类问题时表现良好的原因。Dropout 层用于停用一些神经元,在训练过程中减少模型的过拟合。然后,我们将使用 Adadelta 优化器编译模型。

    batch_size = 128
    num_classes = 10
    epochs = 10
    model = Sequential()
    model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=input_shape))
    model.add(Conv2D(64, (3, 3), activation='relu'))
    model.add(MaxPooling2D(pool_size=(2, 2)))
    model.add(Dropout(0.25))
    model.add(Flatten())
    model.add(Dense(256, activation='relu'))
    model.add(Dropout(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() 函数将开始模型的训练。它需要训练数据、验证数据、训练轮数(epochs)和批量大小(batch size)。

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

    hist = model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(x_test, y_test))
    print("模型已成功训练")
    model.save('mnist.h5')
    print("将模型保存为 mnist.h5")
    
  5. 评估模型

    我们的数据集中有 10,000 张图像,这些图像将用于评估我们的模型效果如何。测试数据没有参与训练,因此对于我们的模型来说是全新的数据。MNIST 数据集平衡性很好,我们可以达到约 99% 的准确率。

    score = model.evaluate(x_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 文件的完整代码:

    from keras.models import load_model
    from tkinter import *
    import tkinter as tk
    import win32gui
    from PIL import ImageGrab, Image
    import numpy as np
    
    model = load_model('mnist.h5')
    
    def predict_digit(img):
        # 将图像调整为 28x28 像素
        img = img.resize((28,28))
        # 将 RGB 转换为灰度
        img = img.convert('L')
        img = np.array(img)
        # 重塑以支持模型输入并归一化
        img = img.reshape(1,28,28,1)
        img = img/255.0
        # 预测类别
        res = model.predict([img])[0]
        return np.argmax(res), max(res)
    
    class App(tk.Tk):
        def __init__(self):
            tk.Tk.__init__(self)
            self.x = self.y = 0
            # 创建元素
            self.canvas = tk.Canvas(self, width=300, height=300, bg = "white", cursor="cross")
            self.label = tk.Label(self, text="思考中..", font=("Helvetica", 48))
            self.classify_btn = tk.Button(self, text = "识别", command = self.classify_handwriting) 
            self.button_clear = tk.Button(self, text = "清除", command = self.clear_all)
            # 网格结构
            self.canvas.grid(row=0, column=0, pady=2, sticky=W, )
            self.label.grid(row=0, column=1,pady=2, padx=2)
            self.classify_btn.grid(row=1, column=1, pady=2, padx=2)
            self.button_clear.grid(row=1, column=0, pady=2)
            #self.canvas.bind("<Motion>", self.start_pos)
            self.canvas.bind("<B1-Motion>", self.draw_lines)
    
        def clear_all(self):
            self.canvas.delete("all")
    
        def classify_handwriting(self):
            HWND = self.canvas.winfo_id() # 获取画布的句柄
            rect = win32gui.GetWindowRect(HWND) # 获取画布的坐标
            im = ImageGrab.grab(rect)
            digit, acc = predict_digit(im)
            self.label.configure(text= str(digit)+', '+ str(int(acc*100))+'%')
    
        def draw_lines(self, event):
            self.x = event.x
            self.y = event.y
            r=8
            self.canvas.create_oval(self.x-r, self.y-r, self.x + r, self.y + r, fill='black')
    
    app = App()
    mainloop()
    
截图
  • Python 机器学习项目输出为数字 2
  • Python 机器学习项目输出为数字 5
  • Python 项目输出为数字 6

总结

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

参考资料

资料名称链接
Keras 官方文档https://keras.io/
TensorFlow 官方文档https://tensorflow.google.cn/
MNIST 数据集介绍http://yann.lecun.com/exdb/mnist/
手写数字识别教程https://data-flair.training/blogs/handwritten-digit-recognition/
Python GUI 开发概述https://docs.python.org/3/library/tkinter.html
Tkinter 详细介绍https://www.tutorialspoint.com/python/python_gui_programming.htm
深度学习入门https://deeplearning.ai/
卷积神经网络入门https://cs231n.github.io/convolutional-networks/
机器学习基础https://www.coursera.org/courses?query=machine%20learning
数据预处理技巧https://machinelearningmastery.com/preparing-data-for-deep-learning/
Python 项目示例https://github.com/data-flair-training-deep-learning/
手写数字识别研究论文https://arxiv.org/abs/1509.06322
图像识别技术综述https://www.sunfounder.com/learn/opencv-101

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

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

相关文章

Python Pyside6 加Sqlite3 写一个 通用 进销存 系统 初型

图: 说明: 进销存管理系统说明文档 功能模块 1. 首页 显示关键业务数据商品总数供应商总数本月采购金额本月销售金额显示预警信息库存不足预警待付款采购单待收款销售单2. 商品管理 商品信息维护商品编码(唯一标识)商品名称规格型号单位分类进货价销售价库存数量预警…

Ubuntu安装K8S

第一步&#xff1a; 安装docker Install Docker #注意docker是早期的名称已经过时了&#xff0c;因此请使用如下命令&#xff0c;一步到位安装docker-ce。 第二步&#xff1a;设置K8S源&#xff1a; &#xff08;大陆使用aliyun源&#xff0c;大陆外使用google源&#xff09;…

Linux图形界面详解以及替换桌面程序方法

说明&#xff1a;本文章主要说明Linux图形界面的启动流程&#xff0c;以及使用自己的图形化应用替换桌面程序的方法&#xff0c;类似与安卓启动会启动Launcher&#xff0c;使用自己程序替换Launcher一样&#xff0c;实现应用独占系统&#xff0c;或者设计自己的桌面程序。 一、…

第4章 Kafka核心API——Kafka客户端操作

Kafka客户端操作 一. 客户端操作1. AdminClient API 一. 客户端操作 1. AdminClient API

使用 Java 和 FreeMarker 实现自动生成供货清单,动态生成 Word 文档,简化文档处理流程。

在上一篇博客中主要是使用SpringBootApache POI实现了BOM物料清单Excel表格导出&#xff0c;详见以下博客&#xff1a; Spring Boot Apache POI 实现 Exc&#xff08;&#xff09;el 导出&#xff1a;BOM物料清单生成器&#xff08;支持中文文件名、样式美化、数据合并&#…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)边缘检测

OpenCV中边缘检测四种常用算子&#xff1a; &#xff08;1&#xff09;Sobel算子 Sobel算子是一种基于梯度的边缘检测算法。它通过对图像进行卷积操作来计算图像的梯度&#xff0c;并将梯度的大小作为边缘的强度。它使用两个3x3的卷积核&#xff0c;分别用于计…

R语言绘图

多组火山图 数据准备&#xff1a; 将CSV文件同一在一个路径下&#xff0c;用代码合并 确保文件列名正确 library(fs) library(dplyr) library(tidyr) library(stringr) library(ggplot2) library(ggfun) library(ggrepel)# 获取文件列表 file_paths <- dir_ls(path &quo…

IDEA2023版中TODO的使用

介绍&#xff1a;TODO其实本质上还是注释&#xff0c;只不过加上了TODO这几个字符&#xff0c;可以让使用者快速找到。 注意&#xff1a;在类、接口等文件中&#xff0c;注释是使用// 即&#xff1a;// TODO 注释内容 在配置文件中&#xff0c;注释是使用# 即&#xff1a;# TO…

Maven的多模块架构设计诺依的多模块

Maven的多模块架构设计 多模块架构设计&#xff0c;本文采用 诺依的多模块架构设计分析

【JsonViewer】Json格式化

使用 Notepad 对 Json 数据进行格式化处理&#xff0c;使数据在结构上更清晰 1.在线安装 安装之后&#xff0c;重启应用&#xff0c;在插件菜单栏即可看到 JsonViewer 选项&#xff0c;在 Notepad 中放入 Json 数据&#xff0c;点击 Format Json 进行数据格式化 2.离线安装 …

【漏洞预警】FortiOS 和 FortiProxy 身份认证绕过漏洞(CVE-2024-55591)

文章目录 一、产品简介二、漏洞描述三、影响版本四、漏洞检测方法五、解决方案 一、产品简介 FortiOS是Fortinet公司核心的网络安全操作系统&#xff0c;广泛应用于FortiGate下一代防火墙&#xff0c;为用户提供防火墙、VPN、入侵防御、应用控制等多种安全功能。 FortiProxy则…

企业分类相似度筛选实战:基于规则与向量方法的对比分析

文章目录 企业表相似类别筛选实战项目背景介绍效果展示基于规则的效果基于向量相似的效果 说明相关文章推荐 企业表相似类别筛选实战 项目背景 在当下RAG&#xff08;检索增强生成&#xff09;技术应用不断发展的背景下&#xff0c;掌握文本相似算法不仅能够助力信息检索&…

Ubuntu打开文件夹不显示文件

1.情况介绍 使用ubuntu打开文件夹不显示文件夹里面的内容&#xff0c;而是直接打开了资源查看器。 2.解决办法 命令行安装nautilus sudo apt-get install nautilus

Go-知识 版本演进

Go-知识 版本演进 Go release notesr56(2011/03/16)r57(2011/05/03)Gofix 工具语言包工具小修订 r58(2011/06/29)语言包工具小修订 r59(2011/08/01)语言包工具 r60(2011/09/07)语言包工具 [go1 2012-03-28](https://golang.google.cn/doc/devel/release#go1)[go1.1 2013-05-13]…

pycharm+pyside6+desinger实现查询汉字笔顺GIF动图

一、引言 这学期儿子语文期末考试有一道这样的题目&#xff1a; 这道题答案是B&#xff0c;儿子做错了选了C。我告诉他“车字旁”和“车”的笔顺是不一样的&#xff0c;因为二者有一个笔画是不一样的&#xff0c;“车字旁”下边那笔是“提”&#xff0c;而“车”字是“横”&am…

Red Hat8:搭建DHCP服务器

1、新建挂载文件 2、挂载 3、关闭防火墙 4、搭建yum源 &#xff08;搭建的时候用vim 自行定义文件名.repo或者是vi 自行定义文件名.repo&#xff09; 5、安装dhcp-server 6、复制模板文件 dhcpd.conf 是DHCP服务的配置文件&#xff0c;DHCP服务所有参数都是通过修改dhcpd.co…

Web前端------HTML链接标签

1.普通超链接 &#xff08;1&#xff09;链接外部网页 点击文本&#xff0c;跳转到外部网页 <!DOCTYPE html><html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, i…

linux下springboot项目nohup日志或tomcat日志切割处理方案

目录 1. 配置流程 2. 配置说明 其他配置选项&#xff1a; 3. 测试执行 4. 手动执行 https://juejin.cn/post/7081890486453010469 通常情况下&#xff0c;我们的springboot项目部署到linux服务器中&#xff0c;通过nohup java -jar xxx.jar &指令来进行后台运行我们…

每日进步一点点(网安)

1.BUU CODE REVIEW 1 先看源代码 <?phphighlight_file(__FILE__);class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(uniqid());if($this->correct $this->input) {ec…

2025.1.19机器学习笔记:PINN文献精读

第三十周周报 一、文献阅读题目信息摘要Abstract创新点物理背景网络框架实验实验一&#xff1a;直道稳定流条件实验二&#xff1a;环状网络中的非稳定流条件 结论缺点及展望 二、代码实践总结 一、文献阅读 题目信息 题目&#xff1a;《Enhanced physics-informed neural net…