详解与实战TensorFlow MNIST手写体数字识别(softmax and cnn)

版权声明:版权所有,原创文章请留言转载,并注明出处! https://blog.csdn.net/qq_36441393/article/details/88227860

MNIST是一套手写体数字的图像数据集,包含60000个训练样本和10,000个测试集,由纽约大学的Yann LeCun等人维护。

MNIST 手写体数字介绍

MNIST图像数据集使用形如【28,28】的二姐数组来表示每个手写体数字,数组中的每个元素对应一个像素点,即每张图像大小固定为28X28像素。

MNIST数据集中的图像都是256阶灰度图,即灰度值0表示白色( 背景),255表示黑色(前景),使用取值为【0,255】的uint8数据类型表示图像。为了加速训练,我们需要做数据规范化,将灰度值缩放为【0,1】的float32数据类型。

由于每张图像的尺寸是28X28像素,为了方便连续存储,我们可以将形如【28,28】的二姐数组“摊平”成形如【784,】的一阶数组,可以表示256*256*···*256 =256^784 张不同的图像。

但这些图像并非每一张都代表有效的手写体数字,其中绝大部分都是如下的噪声图:

下载和读取MNIST数据集

import tensorflow as tf
# 从tensorflow.examples.tutorials.mnist 导入模块
# 这是TensorFlow 为了教学MNIST而提前编制的程序
from tensorflow.examples.tutorials.mnist import input_data
# 从MNIST_data/中读取MNIST数据,这条语句在数据不存在时,会自动执行下载
mnist = input_data.read_data_sets("MNIST_data/")

(这种方法是被广泛使用的下载和读取的方法,如今被废弃,但仍然好用只是会多出一些警告,可以不用管。)

以下是最新的下载使用方式,使用kears:

from keras.datasets import mnist
(x_train,y_train),(x_test,y_test) = mnist.load_data()

MNIST 数据集 样例可视化

激活函数(activation Function)

为了实现神经网络的非线性建模能力,解决一些线性不可分的问题,我们通常使用激活函数来引入非线性因素。激活函数都采用非线性函数,常用的Sigmoid、tanh、ReLU等。

全连接层(fully connected layers ,FC)

全连接层是一种对输入数据直接做线性变换的线性计算层。他是神经网络中最常用的一种层,用于学习输出数据和输入数据之间的变换关系。全连接层可作为特征提取层使用,在学习特征的同时实现特征融合;也可以作为最终的分类层使用,器输出神经元的值代表了每个输出类别的概率。

前向传播

后向传播(Back Propagation,BP)

BP算法的基本思想是通过损失函数对模型参数进行求导,并根据符合函数求导常用的“链式法则”将不同层的模型参数的梯度联系起来,使得计算所有模型参数的梯度更简单。

MNIST Softmax 网络

将表示手写体数字的形如【784】的一位向量作为输入;中间定义2层512个神经元的隐藏层,具备一定模型的复杂度,足以识别手写体数字;最后定义1层10个神经元的全连接层,用于输出10个不同类别的“概率”。

MNIST Softmax 代码

MNIST CNN 网络介绍

CNN模型是一种以卷积为核心的前馈神经网络模型。20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络(ConvoluTional Neural Networks,简称CNN)。

卷积层(Convolutional Layer ,conv)

卷积层是使用一系列卷积核与多通道输入数据做卷积的线性计算层。卷积层的提出是为了利用输入数据(如图像)中特征的局域性和位置无关性来降低整个模型的参数量。卷积运算过程与图像处理算法中常用的空间滤波是类似的。因此,卷积常常被通俗地理解为一中“滤波”过程,卷积核与输入数据作用之后得到了“滤波”后的图像,从而提出了图像的特征。

池化层(Pooling)

池化层是用与缩小数据规模的一种非线性计算层。为了降低特征维度,我们需要对输入数据进行采样,具体做法是在一个或者多个卷积层后增加一个池化层。池化层有三个参数决定:(1)池化类型,一般有最大池化和平均池化两种;(2)池化核的大小K;(3)池化核的滑动间隔。

Dropout层

Dropout 是常用的一种正则化方法,Dropout层是一种正则化层。全连接层参数数量非常庞大(占据了CNN模型参数量的80%~90%左右),发生过拟合问题的风险比较高,所以我们通常需要一些正则化方法训练带有全连接层的CNN模型。在每次迭代训练时,将神经元以一定的钙离子暂时随机丢弃,即在当前迭代中不参与训练。

Flatten

将卷积和池化后提取的特征摊平后输入全连接网络,这里与MNIST softmax网络的输入层类似。MNIST CNN 输入特征,MNIST Softmax输入原图。

MNIST CNN示意图

MNIST CNN代码

TensorBoard 展示

关于可视化的介绍可以参考TensorBoard: 深度学习可视化,以及我们公众号下一篇的内容。

调出TensorBoard

以下为本项目可视化浏览器部分截图:

SCALARS

IMAGES(部分截图)

GRAPHS

DISTRIBUTION(部分截图)

HISTOGRAMS(部分截图)

-(完)-

本篇主要参考学习极客时间彭靖田老师教程

本文任何问题联系本公众号小编解惑

猜你喜欢

转载自blog.csdn.net/qq_36441393/article/details/88227860
今日推荐