Python :MNIST手写数据集识别 + 手写板程序 最详细,直接放心,大胆地抄!跑不通找我,我包教!

您所在的位置:网站首页 手写数字图像识别 Python :MNIST手写数据集识别 + 手写板程序 最详细,直接放心,大胆地抄!跑不通找我,我包教!

Python :MNIST手写数据集识别 + 手写板程序 最详细,直接放心,大胆地抄!跑不通找我,我包教!

2024-06-05 22:51| 来源: 网络整理| 查看: 265

目录

一、背景与总概

二、研究对象

三、数据表示与结构

四、选择的模型

五、效果展示 

六、画板部分

七、直接抄,直接方向跑!

所有的工程文件百度云连接,包含模型!

链接:https://pan.baidu.com/s/1RlS0aVPOFwmNBPBHmcF0SQ  提取码:MATR  --来自百度网盘超级会员V3的分享

注意:人工智能预测的闪退问题是在main文件同目录下没有image_rgzn的文件夹,添加就好。

一、背景与总概

        利用Python语言编写和调试一个识别手写数字图像的三层深度前馈网络,包括数据预处理,网络模型构建,模型参数初始化和正向推理,反向梯度下降参数寻优,最后模型预测的功能。目的是学会基本的深度网络模型建立、训练和推理过程,理解深度网络的实现原理。

        通过自己学习人工智能之后,发现了三个的重要经验和总结,第一个是你对你研究事物本质的理解;第二个是,将你研究事物进行数据化,找到一个合理的数据表示以及数据的结构;第三个是,寻找与这个数据表示的形式和结构合适的“模型”(即模型算法等)。依据上面数据到模型的这个思路,对下文进行一个描写

        首先,介绍一下MNIST手写数据集,这就是我们研究的事物了。该数据集包含60,000个用于训练的示例和10,000个用于测试的示例。数据集包含了0-9共10类手写数字图片,每张图片都做了尺寸归一化,都是28x28大小的灰度图。

训练集图像:train-images-idx3-ubyte.gz(9.9MB,包含60000个样本) 训练集标签:train-labels-idx1-ubyte.gz(29KB,包含60000个标签) 测试集图像:t10k-images-idx3-ubyte.gz(1.6MB,包含10000个样本) 测试集标签:t10k-labels-idx1-ubyte.gz(5KB,包含10000个标签)

下图展示一些具体例子:

        其次是手写板程序,在PyQt5实例 画板小程序_pyqt5画图板_CreatorGG的博客-CSDN博客的程序基础之上添加了,1人工智能预测,2预测结果展示的文本框。

        传统机器学习的问题与缺陷随着深度学习的发展被得到解决,深度学习也可以说是神经网络的重命名,他是建立在多层非线性的神经网络结构之上,对数据表示进行抽象的一系列机器学习。深度学习的出现使得图像,语言得到突破性的发展。本此处理的数据为图像,所以最后我本次选用的模型是人工智能深度神经网络(一般的神经网络)。你也可以使用卷积神经网络模型,卷积神经网络是对将局部的特征十分的敏感,正确率会更高。

二、研究对象

        在你的PycharmIDE里创建一个function.py的文件,在里面定义如下函数:

         1:jiexi_image(path),此函数需要一个字符串对象的输入,是两个训练集和测试集的图像文件地址,返回的对象是一个numpy.array的对象。

def jiexi_image(path): # 用二进制读取 data = open(path, 'rb').read() offset = 0 fmt_header = '>iiii' magic_number, num_images, num_rows, num_cols = struct.unpack_from(fmt_header, data, offset) print('魔数:%d, 图片数量: %d张, 图片大小: %d*%d' % (magic_number, num_images, num_rows, num_cols)) image_size = num_rows * num_cols offset += struct.calcsize(fmt_header) fmt_image = '>' + str(image_size) + 'B' images = np.empty((num_images, num_rows, num_cols)) for i in range(num_images): if (i + 1) % 10000 == 0: print('已解析 %d' % (i + 1) + '张') images[i] = np.array(struct.unpack_from(fmt_image, data, offset)).reshape((num_rows, num_cols)) offset += struct.calcsize(fmt_image) return images

        2: jiexi_label(path) ,传入参数是训练集和测试集的两个label标签文件地址,是一个字符串对象,返回的也是一个numpy.array的对象。

def jiexi_label(path): data = open(path, 'rb').read() offset = 0 fmt_header = '>ii' magic_number, num_images = struct.unpack_from(fmt_header, data, offset) print('魔数:%d, 图片数量: %d张' % (magic_number, num_images)) # 解析数据集 offset += struct.calcsize(fmt_header) fmt_image = '>B' labels = np.empty(num_images) for i in range(num_images): if (i + 1) % 10000 == 0: print('已解析 %d' % (i + 1) + '张') labels[i] = struct.unpack_from(fmt_image, data, offset)[0] offset += struct.calcsize(fmt_image) return labels

        3:plot_data(images,labels,n,issave = False),传入图像,image是一个numpy.array对象;传入的标签,labels是一个numpy.array对象;传入的issave是一个判断逻辑值,如果是真就保存图片,但是一般是不保存的。

def plot_data(images,labels,n,issave = False): for i in range(n): print(labels[i]) plt.imshow(images[i], cmap='gray') plt.show() # if(issave == True): # plt.savefig(fname = "save"+str(datetime.datetime.now())+".jpg") print('done')

         接下来在你的工程文件夹下建立一个train.py 文件,在里面利用function.py里你设定的函数来解析训练集图像和测试集图像,训练集标签和测试集标签,然后利用plot_data函数打印数据,查看是否对应。

import function #start1 = time.time() train_image_path = './MNIST/train-images-idx3-ubyte/train-images.idx3-ubyte' train_lable_path = './MNIST/train-labels-idx1-ubyte/train-labels.idx1-ubyte' teat_image_path = './MNIST/t10k-images-idx3-ubyte/t10k-images.idx3-ubyte' teat_lable_path = './MNIST/t10k-labels-idx1-ubyte/t10k-labels.idx1-ubyte' # #加载数据 train_image = function.jiexi_image(train_image_path) train_lable = function.jiexi_label(train_lable_path) teat_image = function.jiexi_image(teat_image_path) test_lable = function.jiexi_label(teat_lable_path) # print(train_image.shape) function.plot_data(train_image, train_lable, 10, True)

        最终效果:

                      

        可以看出是正确的。 

三、数据表示与结构

        既然train_image, train_lable, teat_image , test_lable 是numpy.array对象,那么我们就可以对他进行操作,对他进行打印输出,print(train_image):

         什么也看不出来,那我们打印一下他的维度来看看, ​​​,是一个三维数组。

        打印train_image[0]来看:

         然后可以推知,我们要处理的对象结构是如下图所示。

四、选择的模型

        传统机器学习的问题与缺陷随着深度学习的发展被得到解决,深度学习也可以说是神经网络的重命名,他是建立在多层非线性的神经网络结构之上,对数据表示进行抽象的一系列机器学习。深度学习的出现使得图像,语言得到突破性的发展。本此处理的数据为图像,所以最后我本次选用的模型是人工智能深度神经网络(一般的神经网络)。你也可以使用卷积神经网络模型,卷积神经网络是对将局部的特征十分的敏感,正确率会更高。

        在你的工程文件下创建一个DeepNET.py的文件,里面是深度神经网络所需要的各种函数。从零开始,从理论到代码实现无论是在研究和学习都是十分有帮助的,希望我和各位读者都保持住这个习惯。

        本次,假设你已经有一定的知识储备了,如梯度下降法的本质,神经网络结构基本清楚,如果不清楚就十分推荐,deeplearning的吴大师的视频教程 [双语字幕]吴恩达深度学习deeplearning.ai_哔哩哔哩_bilibili 教的非常细致。

        第一步,导入库,在DeepNET.py的文件里完善搭建深度神经网络所需要的函数。

        深度神经网络概述,Deep Neural Networks, 深度神经网络,以下简称DNN。DNN里最基本的单元是神经元模型。每个神经元与其他神经元相连,当他“兴奋”时,就会向相连的神经元发送物质,改变神经元的电位。如果某个神经元的电位超过了一个阀值,那么它就会被激活。结果抽象可以得到沿用至今的M_P神经元模型。

        线性部分,是简单的相乘相加,激活部分是利用激活函数处理得到输出。常见的激活函数有sigmoid,relu等,本次采用的激活函数是relu函数。

        由神经元组成的多层神经网络,如图所示。有输入层,输出层以及中间隐含层。每一个输入线性求合,通过激活函数,传到下一个神经元,我们大可不必一个个的去算,我们可以使用向量化来使得我们的程序更加简洁。

        梯度下降法:

 

  

(下面为了简单我以输入的对象是28*28规格图片,第一层隐含单元有200个,第二层隐含单元是100个,输出层为10个的网络结构阐述。)

一般的构造网络的流程:

        初始化超参数(包括启动深度神经网络的权值w,偏执b)--》向前传播(线性部分+激活函数)--》 计算代价 --》 反向传播 (激活函数反向,线性部分反向)--》更新超参数.

基础部分和总概 网络结构为 [28*28 200 100 10]

        学习人工智能,应该理论应用于实践,应该多动手进行数学演算,将演算用代码实现,最后进行总结于改进。

(1)对这个网络的结构要有一个清楚的认识

        在草稿本上进行矩阵维数的测试 

 

下面是对于想要了解代码一个个看清楚流程的去看,如果想直接跑通,代码在最后!

1、导入库,是导入一些必要的库

import matplotlib.pyplot as plt import numpy as np import datetime import os import sys import h5py

2、定义所需要的softmax函数

def sigmoid(Z): A = 1/(1+np.exp(-Z)) cache = Z return A, cache def sigmoid_backward(dA, cache): Z = cache s = 1/(1+np.exp(-Z)) dZ = dA * s * (1-s) return dZ # relu函数 和反向求导 def relu(Z): A = np.maximum(0,Z) cache = Z return A, cache def relu_backward(dA, cache): Z = cache dZ = np.array(dA, copy=True) dZ[Z


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3