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

news2025/1/18 22:00:03

在这里插入图片描述
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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Datawheel学习]用Llama-index创建Agent、数据库对话Agent和RAG接入Agent

1.Llama-index创建Agent 1.0 背景知识 什么是Llama-index? LlamaIndex&#xff08;原名GPT Index&#xff09;是一个专为大语言模型&#xff08;LLMs&#xff09;设计的数据框架&#xff0c;旨在帮助用户将外部数据与LLMs结合&#xff0c;实现更高效的数据检索和知识增强生成…

FPGA:Quartus软件与操作系统版本对照表

文章目录 1.软件概述2.软件版本3.设计流程4.支持的设备5.新特性6.版本对照 1.软件概述 Quartus软件是由英特尔&#xff08;Intel&#xff09;公司开发的一款功能强大的FPGA&#xff08;现场可编程逻辑门阵列&#xff09;设计工具&#xff0c;广泛应用于数字电路设计、仿真、综…

【网络协议】【http】【https】AES-TLS1.2

【网络协议】【http】【https】AES-TLS1.2 https并不是一个协议 而是在传输层之间添加了SSL/TLS协议TLS TLS 协议用于应用层协议&#xff08;如 HTTP&#xff09;和传输层&#xff08;如 TCP&#xff09;之间&#xff0c;增加了一层安全性来解决 HTTP 存在的问题&#xff0c;H…

数智化转型 | 星环科技Defensor 助力某银行数据分类分级

在数据驱动的金融时代&#xff0c;数据安全和隐私保护的重要性日益凸显。某银行作为数字化转型的先行者&#xff0c;面临着一项艰巨的任务&#xff1a;如何高效、准确地对分布在多个业务系统、业务库与数仓数湖中的约80万个字段进行数据分类和分级。该银行借助星环科技数据安全…

微信小程序:播放音频

在小程序开发中&#xff0c;音频播放是一个重要的功能。本文将详细介绍小程序音频播放的相关知识点&#xff0c;帮助开发者更好地掌握小程序音频播放的实现方法。 一、小程序音频播放的基本流程 在小程序中&#xff0c;音频播放的基本流程如下&#xff1a; 获取音频数据&#…

U盘被格式化后的数据救赎与防范策略

一、U盘格式化后的数据困境 在日常的工作与生活中&#xff0c;U盘作为数据传输与存储的重要工具&#xff0c;扮演着不可或缺的角色。然而&#xff0c;当U盘不幸遭遇格式化操作后&#xff0c;存储在其中的宝贵数据瞬间化为乌有&#xff0c;给用户带来极大的困扰。格式化后的U盘…

关于 Cursor 的一些学习记录

文章目录 1. 写在最前面2. Prompt Design2.1 Priompt v0.1&#xff1a;提示设计库的首次尝试2.2 注意事项 3. 了解 Cursor 的 AI 功能3.1 问题3.2 答案 4. cursor 免费功能体验5. 写在最后面6. 参考资料 1. 写在最前面 本文整理了一些学习 Cursor 过程中读到的或者发现的感兴趣…

基于Oracle与PyQt6的电子病历多模态大模型图形化查询系统编程构建

一、引言 1.1 研究背景阐述 在当今数字化时代,医疗行业正经历着深刻的变革,数字化转型的需求日益迫切。电子病历(EMR)作为医疗信息化的核心,其管理的高效性和数据利用的深度对于提升医疗服务质量、优化临床决策以及推动医学研究具有至关重要的意义。传统的电子病历管理系…

算法(蓝桥杯)贪心算法7——过河的最短时间问题解析

一、题目描述 在漆黑的夜里&#xff0c;N位旅行者来到了一座狭窄且没有护栏的桥边。他们只带了一只手电筒&#xff0c;且桥窄得只够让两个人同时过。如果各自单独过桥&#xff0c;N人所需的时间已知&#xff1b;若两人同时过桥&#xff0c;则所需时间是走得较慢的那个人单独行动…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

SQL2000在win10上安装的方法

安装前最好先关闭防火墙和一些杀毒软件&#xff0c;因为这些软件在安装过程中可能会碰到注册表等一下杀毒软件比较敏感的地带&#xff0c;如果违反杀毒软件的规则会被当做病毒强行终止删除 首相找到C盘下window文件中的sysWOW64文件 鼠标右键&#xff0c;点击属性、安全、高级 …

【12】Word:张老师学术论文❗

目录 题目 ​NO2 NO3 NO4 NO5 NO6 NO7.8 题目 NO2 布局→页面设置→纸张&#xff1a;A4→页边距&#xff1a;上下左右边距→文档网格&#xff1a;只指定行网格→版式&#xff1a;页眉和页脚&#xff1a;页脚距边界&#xff1a;1.4cm居中设置论文页码&#xff1a;插入…

软件授权管理中的软件激活向导示例

软件激活向导示例 在软件许可中&#xff0c;提供许可应该是简单和安全的。这适用于想要在中央许可证服务器上创建新许可证的软件开发人员&#xff0c;也适用于需要在其设备上获得许可证的最终用户。如果所讨论的系统有互联网连接&#xff0c;或是暂时的连接&#xff0c;就可以…

基于微信小程序的摄影竞赛系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

在IDEA中使用通义灵码插件:全面提升开发效率的智能助手

在IDEA中使用通义灵码插件&#xff1a;全面提升开发效率的智能助手 随着软件开发行业对效率和质量要求的不断提高&#xff0c;开发者们一直在寻找能够简化工作流程、提升代码质量的工具。阿里云推出的通义灵码插件正是这样一个旨在帮助开发者更高效地编写高质量代码的强大工具…

【Unity3D】利用Hinge Joint 2D组件制作绳索效果

目录 一、动态绳索 &#xff08;可移动根节点&#xff09; 二、静态绳索 三、利用Skinning Editor(Unity2022.3.15f1正常使用) 四、注意事项 一、动态绳索 &#xff08;可移动根节点&#xff09; 动态绳索 DynamicRope空物体 Anchor和whitecircle是相同位置的物体&#xff…

游戏引擎学习第80天

Blackboard&#xff1a;增强碰撞循环&#xff0c;循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改&#xff0c;以便实现一些新的功能。具体来说&#xff0c;是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏&#xff0c;目标是构建一些更丰富…

2025.1.15——四、布尔注入

题目来源&#xff1a;ctfhub技能树 目录 一、基本操作&#xff1a;整理已知信息&#xff0c;得到本题为布尔注入 方法一&#xff1a;手工盲注&#xff08;不推荐&#xff09; step 1&#xff1a;判断具体形式 step 2&#xff1a;查询字段数 step 3&#xff1a;通过回显判…

PE文件:节表-添加节

在所有节的空白区域都不够存放我们想要添加的数据时&#xff0c;这个时候可以通过添加节来扩展我们可操作的空间去存储新的数据&#xff08;如导入表、代码或资源&#xff09;。 过程步骤 1.判断是否有足够的空间添加节表 PE文件的节表紧跟在PE头之后&#xff0c;每个节表的…

【前端动效】HTML + CSS 实现打字机效果

目录 1. 效果展示 2. 思路分析 2.1 难点 2.2 实现思路 3. 代码实现 3.1 html部分 3.2 css部分 3.3 完整代码 4. 总结 1. 效果展示 如图所示&#xff0c;这次带来的是一个有趣的“擦除”效果&#xff0c;也可以叫做打字机效果&#xff0c;其中一段文本从左到右逐渐从…