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 矩阵的情势表示,每个单元格包含灰度像素值。
下载项目标完整源代码
实现手写数字辨认项目
以下是实现手写数字辨认项目标步调:
- 导入库并加载数据集
起首,我们将导入训练模子所需的全部模块。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)
复制代码 - 预处置惩罚数据
图像数据不能直接输入到模子中,因此我们必要执行一些操作来处置惩罚数据,使其准备好用于我们的神经网络。训练数据的维度是 (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], '测试样本')
复制代码 - 创建模子
如今我们将在这个 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'])
复制代码 - 训练模子
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")
复制代码 - 评估模子
我们的数据会合有 10,000 张图像,这些图像将用于评估我们的模子效果怎样。测试数据没有参与训练,因此对于我们的模子来说是全新的数据。MNIST 数据集平衡性很好,我们可以达到约 99% 的准确率。
- score = model.evaluate(x_test, y_test, verbose=0)
- print('测试损失:', score[0])
- print('测试准确率:', score[1])
复制代码 - 创建用于预测数字的 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.htmlTkinter 具体介绍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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |