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

嚴華  金牌会员 | 2025-1-21 02:14:38 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 911|帖子 911|积分 2733


Python 深度学习项目:手写数字辨认
为了使机器更加智能,开发者们正在深入研究机器学习和深度学习技能。人类通过不断训练和重复来学习执行某项任务,从而记住怎样完成这些任务。然后,大脑中的神经元会主动触发,他们可以或许快速执行已经学到的任务。深度学习与此也非常相似。它使用差别类型的神经网络架构来解决差别类型的题目,例如——对象辨认、图像和声音分类、对象检测、图像分割等。
什么是手写数字辨认?

手写数字辨认是指计算机辨认手写数字的本领。这是一项对机器来说较为困难的任务,由于手写数字并不完美,可能有很多差别的书写风格。手写数字辨认为这个题目提供了解决方案,它使用数字的图像来辨认图像中的数字。
关于 Python 深度学习项目

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

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

使用以下命令安装该项目所需的库:
  1. pip install numpy, tensorflow, keras, pillow
复制代码
MNIST 数据集

这可能是机器学习和深度学习爱好者中最受接待的数据集之一。MNIST 数据集包含 60,000 张用于训练的手写数字图像(从 0 到 9),以及 10,000 张用于测试的图像。因此,MNIST 数据集有 10 个差别的类别。手写数字图像以 28×28 矩阵的情势表示,每个单元格包含灰度像素值。
下载项目标完整源代码

实现手写数字辨认项目

以下是实现手写数字辨认项目标步调:

  • 导入库并加载数据集
    起首,我们将导入训练模子所需的全部模块。Keras 库中已经包含了一些数据集,MNIST 就是其中之一。因此,我们可以轻松地导入数据集并开始使用它。mnist.load_data() 方法返回我们训练数据、其标签以及测试数据和其标签。
    1. import keras
    2. from keras.datasets import mnist
    3. from keras.models import Sequential
    4. from keras.layers import Dense, Dropout, Flatten
    5. from keras.layers import Conv2D, MaxPooling2D
    6. from keras import backend as K
    7. # 训练和测试数据集
    8. (x_train, y_train), (x_test, y_test) = mnist.load_data()
    9. print(x_train.shape, y_train.shape)
    复制代码
  • 预处置惩罚数据
    图像数据不能直接输入到模子中,因此我们必要执行一些操作来处置惩罚数据,使其准备好用于我们的神经网络。训练数据的维度是 (60000,28,28)。CNN 模子必要一个额外的维度,因此我们将矩阵重塑为 (60000,28,28,1) 的形状。
    1. x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
    2. x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
    3. input_shape = (28, 28, 1)
    4. # 将类向量转换为二进制类矩阵
    5. y_train = keras.utils.to_categorical(y_train, num_classes)
    6. y_test = keras.utils.to_categorical(y_test, num_classes)
    7. x_train = x_train.astype('float32')
    8. x_test = x_test.astype('float32')
    9. x_train /= 255
    10. x_test /= 255
    11. print('x_train shape:', x_train.shape)
    12. print(x_train.shape[0], '训练样本')
    13. print(x_test.shape[0], '测试样本')
    复制代码
  • 创建模子
    如今我们将在这个 Python 数据科学项目中创建我们的 CNN 模子。CNN 模子通常包含卷积层和池化层。它在处置惩罚以网格布局表示的数据时效果更好,这也是为什么 CNN 用于图像分类题目时体现良好的原因。Dropout 层用于停用一些神经元,在训练过程中减少模子的过拟合。然后,我们将使用 Adadelta 优化器编译模子。
    1. batch_size = 128
    2. num_classes = 10
    3. epochs = 10
    4. model = Sequential()
    5. model.add(Conv2D(32, kernel_size=(3, 3),activation='relu',input_shape=input_shape))
    6. model.add(Conv2D(64, (3, 3), activation='relu'))
    7. model.add(MaxPooling2D(pool_size=(2, 2)))
    8. model.add(Dropout(0.25))
    9. model.add(Flatten())
    10. model.add(Dense(256, activation='relu'))
    11. model.add(Dropout(0.5))
    12. model.add(Dense(num_classes, activation='softmax'))
    13. model.compile(loss=keras.losses.categorical_crossentropy,optimizer=keras.optimizers.Adadelta(),metrics=['accuracy'])
    复制代码
  • 训练模子
    Keras 的 model.fit() 函数将开始模子的训练。它必要训练数据、验证数据、训练轮数(epochs)和批量巨细(batch size)。
    训练模子必要一些时间。训练完成后,我们将权重和模子界说保存在 ‘mnist.h5’ 文件中。
    1. hist = model.fit(x_train, y_train,batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(x_test, y_test))
    2. print("模型已成功训练")
    3. model.save('mnist.h5')
    4. print("将模型保存为 mnist.h5")
    复制代码
  • 评估模子
    我们的数据会合有 10,000 张图像,这些图像将用于评估我们的模子效果怎样。测试数据没有参与训练,因此对于我们的模子来说是全新的数据。MNIST 数据集平衡性很好,我们可以达到约 99% 的准确率。
    1. score = model.evaluate(x_test, y_test, verbose=0)
    2. print('测试损失:', score[0])
    3. print('测试准确率:', score[1])
    复制代码
  • 创建用于预测数字的 GUI
    为了创建 GUI,我们在一个新文件中构建了一个交互式窗口,你可以在画布上绘制数字,并通过一个按钮辨认数字。Tkinter 库包含在 Python 标准库中。我们创建了一个 predict_digit() 函数,该函数接收图像作为输入,然后使用训练好的模子来预测数字。
    然后,我们创建了 App 类,该类负责构建我们的应用程序的 GUI。我们创建了一个画布,可以在捕获鼠标变乱时进行绘制,通过一个按钮触发 predict_digit() 函数并体现结果。
    以下是我们的 gui_digit_recognizer.py 文件的完整代码:
    1. from keras.models import load_model
    2. from tkinter import *
    3. import tkinter as tk
    4. import win32gui
    5. from PIL import ImageGrab, Image
    6. import numpy as np
    7. model = load_model('mnist.h5')
    8. def predict_digit(img):
    9.     # 将图像调整为 28x28 像素
    10.     img = img.resize((28,28))
    11.     # 将 RGB 转换为灰度
    12.     img = img.convert('L')
    13.     img = np.array(img)
    14.     # 重塑以支持模型输入并归一化
    15.     img = img.reshape(1,28,28,1)
    16.     img = img/255.0
    17.     # 预测类别
    18.     res = model.predict([img])[0]
    19.     return np.argmax(res), max(res)
    20. class App(tk.Tk):
    21.     def __init__(self):
    22.         tk.Tk.__init__(self)
    23.         self.x = self.y = 0
    24.         # 创建元素
    25.         self.canvas = tk.Canvas(self, width=300, height=300, bg = "white", cursor="cross")
    26.         self.label = tk.Label(self, text="思考中..", font=("Helvetica", 48))
    27.         self.classify_btn = tk.Button(self, text = "识别", command = self.classify_handwriting)
    28.         self.button_clear = tk.Button(self, text = "清除", command = self.clear_all)
    29.         # 网格结构
    30.         self.canvas.grid(row=0, column=0, pady=2, sticky=W, )
    31.         self.label.grid(row=0, column=1,pady=2, padx=2)
    32.         self.classify_btn.grid(row=1, column=1, pady=2, padx=2)
    33.         self.button_clear.grid(row=1, column=0, pady=2)
    34.         #self.canvas.bind("<Motion>", self.start_pos)
    35.         self.canvas.bind("<B1-Motion>", self.draw_lines)
    36.     def clear_all(self):
    37.         self.canvas.delete("all")
    38.     def classify_handwriting(self):
    39.         HWND = self.canvas.winfo_id() # 获取画布的句柄
    40.         rect = win32gui.GetWindowRect(HWND) # 获取画布的坐标
    41.         im = ImageGrab.grab(rect)
    42.         digit, acc = predict_digit(im)
    43.         self.label.configure(text= str(digit)+', '+ str(int(acc*100))+'%')
    44.     def draw_lines(self, event):
    45.         self.x = event.x
    46.         self.y = event.y
    47.         r=8
    48.         self.canvas.create_oval(self.x-r, self.y-r, self.x + r, self.y + r, fill='black')
    49. app = App()
    50. 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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表