一、前言
该文章仅作为个人学习使用
二、正文
项目源代码:深度学习项目 - 使用 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,在画布上绘制一个数字,然后对数字进行分类并显示结果。