本章节主要介绍手写数字图像集MNIST,并且通过神经网络对其进行前向传播。

3.6 手写数字识别

通过神经网络能够对手写数字进行识别处理。

3.6.1 MNIST数据集介绍

为了训练一个手写数字识别模型,必须要用到数据集,这里用的是MNIST数据集,这个数据库主要包含了60000张的训练图像和10000张的测试图像。数据集由四个压缩包构成

图1: MNIST数据集的组成压缩包

3.6.2 MNIST数据集的调用

通过编写一个mnist.py文件,其中定义的函数load_mnist(),能够很方便地读入MNIST数据,其数据形式以:“(训练数据,训练标签),(测试图像,测试标签)”的形式返还读入的MNIST数据。运行mnist.py文件,能够自动下载MNIST数据集,并且完成数据的读入。

下面编写读入MNIST数据集的代码,其中要用到一个mnist.py的文件,这个文件和程序运行文件我会分享到我的博客上:。

#代码在文件:mnist.a.py中
import sys,os
#os模块是Python标准库中提供的与操作系统交互的模块,提供了访问操作系统底层的接口,里面有很多操作系统的函数
#其中os.path模块主要用于文件属性的获取
#sys模块负责程序与Python解释器的交互。sys.path.append(os.pardir)   #为了导入父目录的文件而进行的设定,因为该文件和mnist文件不在一个文件夹中
from dataset.mnist import load_mnist  #调用dataset文件夹中的文件mnist中的load_mnist函数(下载mnist文件)(x_train,t_train),(x_test,t_test)=load_mnist(flatten=True,normalize=False,one_hot_label=False)
#load_mnist以(训练图片,训练标签),(测试图片,测试标签)的形式读入数据集
#normalize:是否将输入图片正规化为0.0-1.0的值,这里没有正规化,图片像素仍然为0-255
#flatten:是否展开输入图像(变为一维数组),这里是用一维数组显示的
#one_hot_label:仅正确标签为1,其他均为0的数组,形如[0,0,0,1,0,0],如果为False,则仅保存2,7等正确解的标签#输出,确定训练集与测试集的数组形状
print('训练集图片形状',x_train.shape)   #训练集图片形状
print('训练集标签形状',t_train.shape)   #训练集标签形状
print('测试集图片形状',x_test.shape)    #测试集图片形状
print('测试集标签形状',t_test.shape)    #测试集标签形状#mnist书写数据集中训练集有6万张图片,测试集中有一万张图片

输出:

训练集图片形状 (60000, 784)
训练集标签形状 (60000,)
测试集图片形状 (10000, 784)
测试集标签形状 (10000,)

3.6.3 对读入的数据集信息进行显示

#代码在文件:mnist_show.py中
import sys,os
sys.path.append(os.pardir)  #为了导入父目录的文件而进行的设定
from dataset.mnist import load_mnist
import numpy as np
from PIL import Image    #图像的显示使用PIL(Python Image Library)模块def img_show(img):     #定义数组转变函数pil_img=Image.fromarray(np.uint8(img))pil_img.show()     #转换后的图片显示
#根据下一步操作可知,图片已经转变为一维数组了,这里需要把图片重新变为28像素X28像素的形状;这里通过Image.fromarray()函数进行转变(x_train,t_train),(x_test,t_test)=load_mnist(flatten=True, normalize=False) #读入load——mnist调取的图片img=x_train[3]     #读取第三张图片的数组
lable=t_train[3]   #读取第三张标签的数组
print(lable)       #输出第三张标签的数组print(img.shape)          #一开始的图片数组形状
img=img.reshape(28,28)    #把数组变为指定的形状
print(img.shape)          #变换后的图片数组形状img_show(img)     #调用图片转化函数,进行图片的显示

输出:
文本:

1
(784,)
(28, 28)

图片:

图2:输出图片

3.6.4神经网络的前向学习

对手写数字图像集,通过神经网络进行前向学习,即给定了训练好的参数(参数信息在文件sample_weight.pkl中),通过输出对每个输入的图像进行预测,判断属于哪一个数字(在下一个章节会对参数的跟新进行说明),并且得出该神经网络的准确性。

神经网络的结构说明:图片大小为28*28=784,即输入为784个神经元,输出层为10个神经元(对应数字0-9),其中有两层隐藏层(度余个隐藏层有50个神经元,第二个神经元由100个神经元)。

#代码在文件:neuarl_network.py中
import sys, os
sys.path.append(os.pardir)  # 为了导入父目录的文件而进行的设定
import numpy as np
import pickle    #调用pickle库
from dataset.mnist import load_mnist  #1.sigmoid函数
def  sigmoid(x):return 1/(1+np.exp(-x))#2.softmax激活函数    (感叹一下,数组计算就是快)
def softmax(a):exp_a=np.exp(a)sum_exp_a=np.sum(exp_a)y= exp_a/ sum_exp_areturn y'''
测试数据的获取:这里函数中的normalize是正规化的意思,正规化能够提高训练结果的准确率
'''
def get_test_data(): (x_train,t_train),(x_test,t_test)=\load_mnist(flatten=True,normalize=True,one_hot_label=False)   #读取数据集的信息 (进行正则化,精度高)#load_mnist(flatten=True,normalize=False,one_hot_label=False)   #读取数据集的信息  (不进行正则化,精度稍低)return x_test,t_test#神经元初始参数的设定(后面用反向传播学习到的参数)
def init_network():with open("sample_weight.pkl",'rb')  as f:network=pickle.load(f)    #获取文件sample_weight.pkl中的权重信息return network#前向传播,进行预测,该网络有两个隐藏层
def predict(network,x):W1,W2,W3=network['W1'],network['W2'],network['W3']b1,b2,b3=network['b1'],network['b2'],network['b3']a1=np.dot(x,W1)+b1  z1=sigmoid(a1)             #第一层输出a2=np.dot(z1,W2)+b2        z2=sigmoid(a2)            #第二层输出a3=np.dot(z2,W3)+b3y=softmax(a3)             #最终输出return y#主函数(进行批处理)
x,t=get_test_data()     #从函数get_test_data() 中获取测试数据
network=init_network()  #权重的选定batch_size=100  #批处理量
accuracy_cnt=0for i in  range(0,len(x),batch_size):x_batch=x[i:i+batch_size]y_batch=predict(network,x_batch)p=np.argmax(y_batch,axis=1)  #获取概率最高的元素的索引accuracy_cnt +=np.sum(p==t[i:i+batch_size])print("Accuracy:"+str(float(accuracy_cnt)/len(x)))

结果:

数据进行预处理:Accuracy:0.9352

更改其中的代码:注销第一句代码,运行第二句代码,其他不变:

图2:代码更改

结果:

数据进行预处理:Accuracy:0.92087

由上述可知:如果对数据进行预处理,即正则化,是能够提高模型识别的准确度的。

本小节的代码内容我已经打包好了,需要的可以留言。
手写数字识别代码

参考书籍:
1.《深度学习–基于python的理论与实现》

《深度学习--基于python的理论与实现》学习笔记6:第三章神经网络(2)相关推荐

  1. 《深度学习入门——基于Python的理论与实现》笔记

    PS:写这篇博客主要是记录下自己认为重要的部分以及阅读中遇到的些问题,加深自己的印象. 附上电子书及源代码: 链接:https://pan.baidu.com/s/1f2VFcnXSSK-u3wuvg ...

  2. 深度学习入门:基于Python的理论与实现①

    深度学习入门:基于Python的理论与实现① 机器学习的三大要素 第一章python入门 1.Numpy 1.1.numpy的N维数组 1.2.numpy广播 1.3访问元素 2.Matplotlib ...

  3. 深度学习入门 基于Python的理论与实现

    作者:斋藤康毅 出版社:人民邮电出版社 品牌:iTuring 出版时间:2018-07-01 深度学习入门 基于Python的理论与实现

  4. 学习《深度学习入门:基于Python的理论与实现》高清中文版PDF+源代码

    入门神经网络深度学习,推荐学习<深度学习入门:基于Python的理论与实现>,这本书不来虚的,一上来就是手把手教你一步步搭建出一个神经网络,还能把每一步的出处讲明白.理解神经网络,很容易就 ...

  5. 【深度学习入门:基于Python的理论与实现】书本学习笔记 第三章 神经网络

    文章目录 1. 阶跃函数的实现 2. 函数图形 2.1 阶跃函数 2.2 sigmoid 函数 2.3 ReLU 函数 3. 多维数组的运算 3.1 矩阵乘法 3.2 神经网络的内积 4. 三层神经网 ...

  6. 将MNIST手写数字数据集导入NumPy数组(《深度学习入门:基于Python的理论与实现》实践笔记)

    将MNIST手写数字数据集导入NumPy数组(<深度学习入门:基于Python的理论与实现>实践笔记) 一.下载MNIST数据集(使用urllib.request.urlretrieve( ...

  7. 深度强化学习:基于Python的理论及实践(英文版)

    深度强化学习结合了深度学习和强化学习,使人工智能体能够在没有监督的情况下学习如何解决顺序决策问题.在过去的十年中,深度强化学习在一系列问题上取得了显著的成果,涵盖从单机游戏和多人游戏到机器人技术等方方 ...

  8. 深度学习入门-基于Python的理论入门与实现源代码加mnist数据集下载推荐

    深度学习入门-基于Python的理论入门与实现源代码加mnist数据集下载推荐 书籍封面 1-图灵网站下载 书里也说了,可以图灵网站下载https://www.ituring.com.cn/book/ ...

  9. 《深度学习入门-基于Python的理论与实现》学习笔记1

    <深度学习入门-基于Python的理论与实现>学习笔记1 第一章Python入门 Python是一个简单.易读.易记的编程语言,可以用类似于英语的语法进行编写程序,可读性高,且能写出高性能 ...

  10. 《深度学习入门--基于python的理论与实现》——斋藤康毅读书笔记

    <深度学习入门--基于python的理论与实现>读书笔记(第二章) 写在前面 第二章:感知机 2.1感知机是什么 2.2简单的逻辑电路 2.2.1与门(and gate) 2.2.2与非门 ...

最新文章

  1. JS收集:限制输入格式
  2. usb接口供电不足_电脑USB接口不够用?来试试ORICO条纹hub扩展器吧
  3. Ubuntu 18.04深度学习环境配置(CUDA9.0+CUDDN7.4+TensorFolw1.8)
  4. 每日一笑 | 床上还是桌上,你总得选一样~
  5. 锐捷交换机配置保存到计算机,锐捷交换机常用配置命令汇总
  6. mac上文字识别(Tesseract-OCR for mac )
  7. 基于Java+SpringBoot+Thymeleaf+Mysql多用户B2C商城平台系统设计与实现
  8. 软件工程之软件质量管理(SQA)
  9. adb之am、pm命令
  10. 1044 : 不及格率
  11. 深度解析DDD中台和微服务设计 | 留言送书
  12. python爬取千图网图片并保存_Python数据分析与挖掘实战-课程作业5爬取千图网某个频道的高清图片...
  13. Blender摄像机环绕运动、动画渲染、视频合成
  14. 在Android上修改读取IMEI码的方法
  15. 服务器内网可以打开外网打不开怎么办?网站搭建后打不开怎么办?
  16. 清橙 A1210. 光棱坦克
  17. android多边形拼图源码,【BMPinTu】一款拼图App的demo。多边形凹凸拼图
  18. PHONEGAP BUILD
  19. 杰理之PC 强制升级【篇】
  20. java+mysql 基于ssm的驾校预约管理系统

热门文章

  1. 2022年终总结-知识沉淀、疫情、展望未来
  2. Lambda将搬砖变成艺术
  3. Splitter 用法
  4. 网络流24题 最小路径覆盖(DCOJ8002)
  5. java convexhull_android java opencv 2.4 convexhull convexdefect
  6. 聚特汇挪车码项目最新反馈
  7. 《孙子兵法》十三篇注译(13--火攻篇)
  8. 服务器如果清理垃圾文件,清理Windows服务器的垃圾文件的批处理
  9. python flask-sqlalchemy flask-marshmallow基本使用
  10. error CS0246: 未能找到类型或命名空间名“A”(是否缺少 using 指令或程序集引用?)