Mnist是一个手写数字数据库,这是一个用烂了的数字数据库,在Tensorflow中也是入门必掌握的首个数据集,光说看不见,下面我们先通过代码测试来认识一下该数据集。
1、Mnist数据集是Tensorflow自带的,直接通过库导入即可;
2、55000个训练数据,10000个测试数据;
3、Mnist中数字图像是28*28灰度像素,但Tensorflow中已经被展开成一维的长度为784的行向量;
4、Mnist中数字标签labels是一维长度为10的行向量,在读取数据时设置参数one_hot=true表示的就是将标签读成一个长度为10的数组,只有一个元素的值是1,其他元素的值是0
一
Softmax实现Mnist手写数字识别系统
Softmax函数在机器学习中经常用到,先让我们理解一下Softmax作用,大家都知道max,如果有a > b,则max函数取a;但是在机器学习中如果一直这么做会导致小的那个数饥饿,所以Softmax函数便避免这一现象,Softmax实现让大的那个数经常取到,小的那个数偶尔取到。
回到Mnist数据集识别上来,一张数字图片数字可能是0-9中任意一个数,Softmax便会给每一个数字分配概率,最后自然是去概率最大的那个数字作为最终的结果。
上图关键代码
先定义输入图像变量x (长度为784的一维向量),[None, 784]其中None的含义是训练时将采用数据批处理,每次处理图片数量未定即None
下面我们来看一下模型评估
其中主要关注tf.argmax和tf.equal函数
tf.argmax函数是给出某个tensor对象在某一个维度上数据最大值所在的索引;
tf.equal函数便是比较真实值和预测值的索引是否一致,也就代表是值是否一致,实现对模型的正确率进行评估
二
CNN实现Mnist手写数字识别系统
CNN卷积神经网络是深度神经网络中的一种,广泛应用于图像处理,本文不详细接受CNN的运作原理。主要分析一下如何在Mnist数据集上建立一个简单的卷积神经网络结构。
首先大致清楚CNN卷积神经网络包含以下五层:
1、输入层
2、卷积层
3、池化层
4、全连接层
5、输出层
上图关键代码
卷积层前先定义输入图像变量x和输出变量y
输入灰度图像x是长度为784的一维的向量,输出y是长度为10的一维0、1向量
在参数w、b的设置过程中要注意特征数的变化,第一层卷积中参数w中[5, 5, 1, 32]其中5,5表示卷积核的大小;1代表图像通道数,本例是灰度图像所以是1,如果是RGB则便是3;32则表示经过第一层卷积层输出的32维特征数据。
看上图,同理,在第二层卷积层中,参数w [5, 5, 32, 64]其中32是因为第一层卷积层输出的是一个32维特征的数据,64则表示第二层卷积将输出64维特征的图像数据
上图,全连接层中,这里着重讲解为什么参数w中的设置为 [7*7*64, 1024]
先看为什么设置7*7*64, 回看上面两层卷积,在每次池化过程中,图像将会变小,池化层中采用的池化核和步长是ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1],即每经过一次池化层图像就会缩小2*2,也就是4倍,经过了两次卷积,原本输入的一维的28*28的图像已经变成了64维的7*7的图像。 这样参数的设置是不是就很清晰了
1024相信大家已经清楚了,就是在全连接层中将图像64维7*7的灰度图像数据映射成长度为1024的一维向量
上图输出层中参数w [1024, 10],其中1024自然便是全连接层输出的是长度为1024的数据,而10便输出最终的预测标签,和最终的标签格式便一致了
最后定义根据预测结果y_conv和真实标签y定义损失函数,启动session会话进行训练和第一种方法就相同了
模型评估和第一种方法相同,这里不在重复
最后对于上述两种方法都能够实现Mnist手写数字识别系统,自然CNN卷积神经网络实现的模型精准度更高,能达到99.2%,自然复杂度也相对较高
喜欢就关注,笔芯
领取专属 10元无门槛券
私享最新 技术干货