当前课程知识点:计算思维与人工智能基础 > 第三部分:python基础 > 第十章:实例分析与实践 > 10.3手写数字识别
下面我们给大家介绍
运用神经网络的模型来去
实现手写数字识别的应用
为了方便
业界进行统一测试和评估算法
1998年
Lecun
Bottou
Bengio和Haffner
发布了手写数字图片的数据集
命名为MNIST
MNIST就是一个简单的
计算机视觉数据集
就是由许多的手写数字图片组成的
我们可以在这个网址下
下载这个数据集
通常的我们装了一些框架的话
是会包含这个数据集的
那么这个数据集是比较经典的
图像识别的数据集
我们前面给大家装了
TrensorFlow
那么这个TrensorFlow的
框架下是包含这个数据集的
这个数据集呢
主要包括两部分
一部分是测试集
一部分是训练集
训练集里面有
60000个图像的样本
和对应的60000个标签
测试集里有10000个
图像样本和10000个标签
那么这些图像的样本图片呢
都是由28×28小数点来构成的
数据及的导入我们可以在
TrensorFlow框架下的
tf.
keras.datasets.
mnist.load_
data()
那么这个通过这条语句呢
我们可以把训练集和测试集导入
也可以在
matplotlib下面去展示
那么它展示出来的就是这样子的
我们可以看到它是由什么呀
0到255的灰度值
来去来显示这个值的
那么如果
我们用矩阵来描述的话
一张28×28的图片来构成
这个标签呢就是0-9的数字
那么在实际的存放中应用中
我们考虑到这个数字之间的关系
所以我们采用这个one-hot
这个编码来取存放
那在这个里面的话
可以输入的时候就把它转换成
一个1×784的一个矩阵
那么输出呢
我们可以用1×10的矩阵来去构建
在这里面的one-hot的编码
形式是这样子
我们可以看的到
有一行组成的
我们这个行业里面最大值的这个下标
其实就是对应我们数字
通过这样的特点
我们可以取出来我们的这个数字
我们前面介绍了这个线性模型
怎样去构建的话我们想
如果只要构建一个线性的模型的话
我们可以看的到
输出的话就等于输入的x全值与b
这里面输入x的矩阵
所以我们的全值也是一个矩阵
进来是1,784
那么全职呢就是应该是784
那输出是10的话
1×10的这样的矩阵
全职就应该是10偏值是10
那么就构成这样的一个矩阵的一个组合
那么对于复杂的问题
我们用线性回归呢
是要寻找优还是比较难的
所以我们需要进行什么呀
多次的迭代
并且做一些非线性化的一些处理
我们通过添加激活函数
前面我们给大家介绍过激活函数有什么呀
我们在这个地方呢是用
今年我们选用这个ReLU函数
ReLU函数的特点大家可以看得到
X小于0的时候它就是0
X大于0的时候呢它就是原来的值
那么ReLU呢它实现了
稀疏后的模型能够
更好的去挖掘相关特征
以及
拟合这个训练数据
那么使模型的这个收敛速度
维持在一个稳定的一个状态
那我们来可以看到
我如果是
多次把这个模型进行迭代
我们说迭代三次呢
我们可以看到进来的是
1乘以784这样的一个矩阵
那么刚才说我们的全值就是
行一定是784
这个列也可以自己构造
构造成256
那么得到这个
H1就是一乘以256这样的矩阵
那么在下面的再一次去
迭代这个模型的时候
他这个全值可以256是定的
我们可以选择128
那么得到的这个H2 1乘以28
W3对应的行肯定是128
列呢是我们输出是1×10的
这样一个one-hot的编码
所以这个列这个地方必须要是10
这就是三层的
我们这个结构已经构建好了
然后在三层迭代
其实这个迭代的
就可以得到我们的一个输出
那么这个输出的话是一个迭代的公式
我们用统一的写法都可以写成这样子
这不就是输出通过relu
第一层第二层第三层
那么每一个输出值
最后得到的结果是一个概率
那么通过这个Lmax呢
我们得到这个最大值的这个缩影
因为这个地方只有一行
所以我们就可以不写
我们在这个地方寻U的时候
也是通过梯度下降法来寻U的
我们这个损失的是定义的均方差损失
那么对应要训练的参数呢
就是我们从W1 784×256
W2 256×128
W3是128×10
然后b1 b2 b3
那这个训练
要训练这么多的参数
那么从这个结构上来看呢
其实我们已经构建了
一个全连接的三层的神经网络
我们再看一下它的结构
那么这个我们构建了一个
全连接的三层网络
第一个输入层这就是我们的一个偏执
然后呢 这是什么呀
我们的X 0到x的783
我们这个矩阵七八次的输入
那么这个里面的全值
全值矩阵就是我们的784×256
那么就相当于这是这条线啊
那么就有这么多条线
那么得到的H1呢
1×256
那么在第二层的话我们
得到全值的是256×128
h2的时候呢
我们可以得到的是什么呀
H2的时候我们就是256
然后第三层的全职呢是128×10
我们所以的到输出是什么
1×10的
这样的一个one-hot的编码
这就是我们这个全连接
这个三层的神经网络的一个构建
那么其实是从一个
从我们线型模型
然后转化成这样一个非线型
然后再多层的迭代构建出来
三层的神经网络模型
下面我们在jupyter下面
来实现这段代码
看一下它的执行结果
我们来在jupyter下看一下
我们首先导入
我们的TrensorFlow框架
以及TrensorFlow下
应用的keras的像这个数据集
还有我们模型构建需要的一些函数包
下面这个就是我们把数据集导入
导入数据集呢
我们可以看一下
我们训练集测试集的个数
可以看训练集有60000个
测试集10000个
我们也可以通过
matplotlib来看一下图片
我们可以看到
这是Y第0个元素的训练集
和X第0个元素这个图片
我们把它把它转换成
28×28的图片可以看的到
那么这个训练集的标签是5
然后我们在训练集的图片是这样子
我们可以看也是一个5
那么当然这个后面的这个
28×28日我们看起来最好
这个本身就是由这个像素点组成
其实也是可以进行变换的
比如说我们把它变换成14
256的这样的一个格式的话
那么它出图片就出这样的
把它两个拆分成两个了
那么在下面的在训练之前
我们需要对这个数据
因为这个里面的这个像素点
是0到255的
我们需要把这个像素点的这个数据呢
把它归一化处理
把它变成0,1之间的数据
所以我们可以除以255
把X的训练集那就是图片X训练图片
和我们的测试图片都做一个转换
转换以后呢 下面呢
我们就可以去构建我们的什么网络
这是我们去训练之前
要做的一些简单的准备
需要我们把这个定义多少批
然后shuffle就是我们多少
到了一千张图片
把他这个洗牌一下洗一下牌
然后我们把它设成可以什么
那可迭代的
我们再可以看一下
我们出来这个sample形状
它会是什么样子的
这是我们其实相当于
一批就是128章
28× 28的图片
那么的标签当然也是128个
那么在修炼之前呢
我们是需要构建我们的参数的
我们前面给大家介绍
w1,b1,
w2,b2,
w3,b3
我们初始的参数呢
我们是通过一个random函数
来去构建它我们在这儿都是通过
满足一个均方差的一个阶段的
一个正态分布的函数来去构建
构建好了以后
我们就是可以去做我们的构建的模型
构建的模型呢
其实我们可以看的到
主要是要通过梯度下降来去完成
那么在这个里面呢
我们看H1这是我们的线性
然后通过relu函数非线性
H二的relu然后呢
我们的输出
输出的他是一个
one-hot的编码
要转换成one-hot的编码
然后这是我们的损失函数
输出one-hot
我们的实际的这个输出跟我们的
我们因为这个标签
我们刚才说的是
前面展示了标签出来的是数字
那数字的可以看到这样的
标签是一个数字
所以我们要把它
转换成one-hot的编码
那one-hot的编码转换完以后
我们可以进行求它的损失
然后均方差损失
那这一段是我们要
构建我们的梯度下降法
那么训练的参数在这里面
w1,b1,
w2,b2,
w3,b3
每一次梯度下降法是需要一个学习率
所以我们在前面就给了一个学习率
那么每一批次
数据集的这个批次进行这个迭代的话
建立了一个循环
刚开始我们把X和X进来的数据
把它进行一个转换转换成浮点数
那下面呢这个就是
关于梯度下降法参数的训练
以及我们参数的更新
那么在这个里面的是训练
100批的话就会输出一个损失值
其实我们可以看的到
我们首先来看训练一下
100有一个损失
我们训练三次以后我们看下损失
每次训练完了以后他的参数
这个W1,W2,W3
以及b1,b2在变化
我们可以在这个基础上
这是初始化的参数
这是训练化的参数
我们其实可以再给它训练一遍
训练一遍
大家可以观察它就比刚才的损失
要更小一些了
我们可以看到
它的第二次训练后他的损失
大概在0.09到1之间
我们可以看一下它的这个训练后的它
我们这个参数有多少个
那么参数就是
W1,W2,W3的
我们这个矩阵的情况
这是它的结构
他们训练完这个训练这个参数
其实下面我们就可以应用应用的话
比如说我们现在可以看一个
预测一个
下标是4的标签
下标是4的标签它出来是4
我们的预测的时候我们可以看
测试集里面我们也下标是4
他们是对应下标是4
那么这个图片
来了我们需要把它转换成什么样
转换成784
那么这个里面这个
-1是可以随便定的
那么转换成浮点数
然后按照我们这个模型
求H1,H2然后再输出
然后我们通过argmax呢
就是把它转换成下标
我们输出下标就是这个预测
所以他这个预测出来的值
这个是我们的输出来的应该是
one-hot的编码
而我们这个是预测的什么我的值
我们预测一下可以看的到啊
这就是出现了一个误差
这里是4的时候这个地方是4
而这个地方是什么呀
这是他的one-hot的编码
one-hot编码出来
我们看下标是什么呀
下标是2的时候02
这是一个什么
这是一个最大值
他是差了一点点这个四也不小
然后但是这个2是大这就是误差
我们刚才有10%的误差
那么再来一个号再测一个
7啊
那我们可以看第7个
它是9
我们在这个地方在看这个7
他算出来的是什么
算出来的这个预测的6
也是有误差的
再来看一下我们这个
5
运行一下是1
这个他应该预测的应该是准确
然后我们可以看到
他这个是预测准确
那么这就是可以看到误差的
那么再是一个90
预测出来的是3
在这个地方90
我们在预测一下
我们可以看到
他这个误差率还稍有点高
我们可以再去训练
那么在去训练一下
训练一下参数
让我们的误差可以再降低一点
我们可以看比刚才的误差有所降低
刚才都是在一点多在零点零几
我们这个训练的误差了以后呢
我们可以用训练的新值
然后我们在这个地方再测再测一次
比如说我们在测一个第9个元素
那么标签还是9
那我们也测一下
这个看它的结果是不是正确
那么可以看在训练了以后
刚才是不准确
那么这个 准确
我们刚才这90让我们也在测一下
90呢它是3
我们这个地方看看90
它给我们出来的是预设的是多少
预测的是3
这就是我们的可以看得到这个
这个我们就可以看的到
预测的准确率会随着我们的训练
它可以不断的提高
但是他也会有一个上界值
就是每一个模型呢
他达到那个集值以后
就不可以再提高了
那这就是我们全连接网络的实现
-章测试
-章测试
-第一章:python简介
--章测试
-第二章:编码规范
--2.2常量和变量
--章测试
-第三章:数据类型
--章测试
-第四章:基本运算
--4.2比较运算符
--4.3逻辑运算符
--4.4位运算符
--章测试
-第五章:程序控制结构
--5.1顺序结构
--5.2条件结构
--5.3循环结构
--5.4跳转结构
--5.5异常处理
--章测试
-第六章:函数、模块与面向对象
--6.2面向对象
--6.4模块与包
--章测试
-第七章:文件操作
--7.2文件的写入
--章测试
-第八章:python生态库
--章测试
-第九章:TensorFlow基础
--章测试
-第十章:实例分析与实践
--章测试
-第十一章:人工智能在自然语言中的应用
--章测试