找回密码
 会员注册
查看: 28|回复: 0

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

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-10 06:53:50 | 显示全部楼层 |阅读模式
目录一、背景与总概二、研究对象三、数据表示与结构四、选择的模型五、效果展示 六、画板部分七、直接抄,直接方向跑!所有的工程文件百度云连接,包含模型!链接: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的对象。defjiexi_image(path):#用二进制读取data=open(path,'rb').read()offset=0fmt_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_colsoffset+=struct.calcsize(fmt_header)fmt_image='>'+str(image_size)+'B'images=np.empty((num_images,num_rows,num_cols))foriinrange(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)returnimages'运行运行        2: jiexi_label(path),传入参数是训练集和测试集的两个label标签文件地址,是一个字符串对象,返回的也是一个numpy.array的对象。defjiexi_label(path):data=open(path,'rb').read()offset=0fmt_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)foriinrange(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)returnlabels'运行运行        3:plot_data(images,labels,n,issave=False),传入图像,image是一个numpy.array对象;传入的标签,labels是一个numpy.array对象;传入的issave是一个判断逻辑值,如果是真就保存图片,但是一般是不保存的。defplot_data(images,labels,n,issave=False):foriinrange(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函数打印数据,查看是否对应。importfunction#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的文件里完善搭建深度神经网络所需要的函数。        深度神经网络概述,DeepNeuralNetworks,深度神经网络,以下简称DNN。DNN里最基本的单元是神经元模型。每个神经元与其他神经元相连,当他“兴奋”时,就会向相连的神经元发送物质,改变神经元的电位。如果某个神经元的电位超过了一个阀值,那么它就会被激活。结果抽象可以得到沿用至今的M_P神经元模型。        线性部分,是简单的相乘相加,激活部分是利用激活函数处理得到输出。常见的激活函数有sigmoid,relu等,本次采用的激活函数是relu函数。    由神经元组成的多层神经网络,如图所示。有输入层,输出层以及中间隐含层。每一个输入线性求合,通过激活函数,传到下一个神经元,我们大可不必一个个的去算,我们可以使用向量化来使得我们的程序更加简洁。        梯度下降法:   (下面为了简单我以输入的对象是28*28规格图片,第一层隐含单元有200个,第二层隐含单元是100个,输出层为10个的网络结构阐述。)一般的构造网络的流程:        初始化超参数(包括启动深度神经网络的权值w,偏执b)--》向前传播(线性部分+激活函数)--》计算代价--》反向传播(激活函数反向,线性部分反向)--》更新超参数.基础部分和总概网络结构为[28*2820010010]    学习人工智能,应该理论应用于实践,应该多动手进行数学演算,将演算用代码实现,最后进行总结于改进。(1)对这个网络的结构要有一个清楚的认识        在草稿本上进行矩阵维数的测试  下面是对于想要了解代码一个个看清楚流程的去看,如果想直接跑通,代码在最后!1、导入库,是导入一些必要的库importmatplotlib.pyplotaspltimportnumpyasnpimportdatetimeimportosimportsysimporth5py2、定义所需要的softmax函数defsigmoid(Z):A=1/(1+np.exp(-Z))cache=ZreturnA,cachedefsigmoid_backward(dA,cache):Z=caches=1/(1+np.exp(-Z))dZ=dA*s*(1-s)returndZ#relu函数和反向求导defrelu(Z):A=np.maximum(0,Z)cache=ZreturnA,cachedefrelu_backward(dA,cache):Z=cachedZ=np.array(dA,copy=True)dZ[Ziiii'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_colsoffset+=struct.calcsize(fmt_header)fmt_image='>'+str(image_size)+'B'images=np.empty((num_images,num_rows,num_cols))foriinrange(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)returnimagesdefjiexi_label(path):data=open(path,'rb').read()offset=0fmt_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)foriinrange(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)returnlabelsdefplot_data(images,labels,n,issave=False):foriinrange(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')##说明:输入原始图像路径和新建图像文件夹名称默认修改出长度宽度为64*64defstdimage(pathorg,name,pathnew=None,width=64,length=64):#检查文件是否建立ifpathnew==None:#如果没有手动创建tage=os.path.exists(os.getcwd()+'\\'+name)#检查一下是否属实ifnottage:#没有整个新文件夹os.mkdir(os.getcwd()+"\\"+name)#创建文件夹,nameimage_path=os.getcwd()+"\\"+name+"\\"else:#已经手动创建tage=os.path.exists(pathnew+"\\"+name)ifnottage:path=os.getcwd()os.mkdir(path+"\\"+name)image_path=path+"\\"+name+"\\"##开始处理i=1#从一开始list_name=os.listdir(pathorg)#获取图片名称列表foriteminlist_name:#检查是否有图片tage=os.path.exists(pathorg+str(i)+'.png')ifnottage:image=Image.open(pathorg+'\\'+item)std=image.resize((width,length),Image.ANTIALIAS)##模式为RGBifnotstd.mode=="RGB":std=std.convert('RGB')std.save(image_path+str(i)+'.png')i+=1deflabel_init(lable):n=lable.shape[0]label_Y=np.zeros([10,n])res=lable.astype(int)foriinrange(0,label_Y.shape[1]):label_Y[res[i],i]=1returnlabel_Ydefget_X(path):im_name_list=os.listdir(path)all_data=[]foriteminim_name_list:try:all_data.append(plt.imread(path+'\\'+item).tolist())except:print(item+"openerror")returnall_data'运行运行(2)DeepNet.pyimportmatplotlib.pyplotaspltimportnumpyasnpimportdatetimeimportosimportsysimporth5py#sigmoiddefsigmoid(Z):A=1/(1+np.exp(-Z))cache=ZreturnA,cachedefsigmoid_backward(dA,cache):Z=caches=1/(1+np.exp(-Z))dZ=dA*s*(1-s)returndZ#relu函数和反向求导defrelu(Z):A=np.maximum(0,Z)cache=ZreturnA,cachedefrelu_backward(dA,cache):Z=cachedZ=np.array(dA,copy=True)dZ[Z
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2025-1-7 07:02 , Processed in 0.470906 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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