深度学习项目 -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_train), (x_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], 28, 28, 1)
x_test = x_test。重塑(x_test。形状[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形状:', 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 = 顺序()
型。add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=input_shape))
型。add(Conv2D(64, (3, 3), activation='relu'))
型。add(MaxPooling2D(pool_size=(2, 2)))
型。加(辍学(0.25))
型。添加(展平())
型。add(Dense(256, 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 = 模型。fit(x_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%的准确率。

分数 = 模型。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文件的完整代码:

来自Keras。模型导入load_model
从 tkinter 导入*
将 tkinter 导入为 tk
导入 Win32GUI
从 PIL 导入 ImageGrab, 图像
将 numpy 导入为 np
模型 = load_model('mnist.h5')
定义 predict_digit(img):
#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。argmax(res), max(res)
App(tk.Tk):
def init(个体经营):
传统知识。Tk。init(自行)
自我。x = 自我。y = 0

创建元素

自我。帆布 = TK。Canvas(self, width=300, height=300, bg = "白色", cursor="cross")
自我。标签 = TK。Label(self, text="思考..", font=("Helvetica", 48))
自我。classify_btn = 传统知识。Button(self, text = "识别", command = self.classify_handwriting)
自我。button_clear = TK。Button(self, text = "清除", command = self.clear_all)

网格结构

自我。帆布。grid(row=0, column=0, pady=2, sticky=W, )
自我。标签。grid(row=0, column=1,pady=2, padx=2)
自我。classify_btn.grid(row=1, column=1, pady=2, padx=2)
自我。button_clear.grid(row=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。GetWindowRect(HWND) # 获取画布的坐标
im = 图像抓取。抓取(矩形))
数字,acc = predict_digit(im)
自我。标签。configure(text= str(digit)+', '+ str(int(acc*100))+'%')
def draw_lines(self, event):
自我。x = 事件。倍
自我。y = 事件。y
r=8
自我。帆布。create_oval(自。X-R, 自身。Y-R, 自我。x + r, 自我。y + r, fill='黑色')
app = 应用()
主环路()

截图:

三、总结



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

相关推荐
远洋录19 分钟前
构建一个数据分析Agent:提升分析效率的实践
人工智能·ai·ai agent
IT古董1 小时前
【深度学习】常见模型-Transformer模型
人工智能·深度学习·transformer
沐雪架构师2 小时前
AI大模型开发原理篇-2:语言模型雏形之词袋模型
人工智能·语言模型·自然语言处理
摸鱼仙人~3 小时前
Attention Free Transformer (AFT)-2020论文笔记
论文阅读·深度学习·transformer
python算法(魔法师版)3 小时前
深度学习深度解析:从基础到前沿
人工智能·深度学习
小王子10243 小时前
设计模式Python版 组合模式
python·设计模式·组合模式
kakaZhui3 小时前
【llm对话系统】大模型源码分析之 LLaMA 位置编码 RoPE
人工智能·深度学习·chatgpt·aigc·llama
struggle20254 小时前
一个开源 GenBI AI 本地代理(确保本地数据安全),使数据驱动型团队能够与其数据进行互动,生成文本到 SQL、图表、电子表格、报告和 BI
人工智能·深度学习·目标检测·语言模型·自然语言处理·数据挖掘·集成学习
佛州小李哥4 小时前
通过亚马逊云科技Bedrock打造自定义AI智能体Agent(上)
人工智能·科技·ai·语言模型·云计算·aws·亚马逊云科技
Mason Lin5 小时前
2025年1月22日(网络编程 udp)
网络·python·udp