Tensorflow卷积神经网络识别Mnist手写数字

作者:星空

QQ:1973683409

技术交流群:

需要源代码或者测试代码有问题的可以加星空的QQ或者交流群,星空也是刚刚入门的初学者,希望能和大家多多交流。

 

 

 

 

一、卷积神经网络的研究背景

 

卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)”。

对卷积神经网络的研究始于二十世纪80至90年代,时间延迟网络和LeNet-5是最早出现的卷积神经网络;在二十一世纪后,随着深度学习理论的提出和数值计算设备的改进,卷积神经网络得到了快速发展,并被大量应用于计算机视觉、自然语言处理等领域。

卷积神经网络仿造生物的视知觉(visual perception)机制构建,可以进行监督学习非监督学习,其隐含层内的卷积核参数共享和层间连接的稀疏性使得卷积神经网络能够以较小的计算量对格点化(grid-like topology)特征,例如像素和音频进行学习、有稳定的效果且对数据没有额外的特征工程(feature engineering)要求。

对卷积神经网络的研究可追溯至日本学者福岛邦彦(Kunihiko Fukushima)提出的neocognitron模型。在其1979和1980年发表的论文中福岛仿造生物的视觉皮层(visual cortex)设计了以“neocognitron”命名的神经网络。neocognitron是一个具有深度结构的神经网络,并且是最早被提出的深度学习算法之一,其隐含层由S层(Simple-layer)和C层(Complex-layer)交替构成。其中S层单元在感受野(receptive field)内对图像特征进行提取,C层单元接收和响应不同感受野返回的相同特征。neocognitron的S层-C层组合能够进行特征提取和筛选,部分实现了卷积神经网络中卷积层(convolution layer)和池化层(pooling layer)的功能,被认为是启发了卷积神经网络的开创性研究

第一个卷积神经网络是1987年由Alexander Waibel等提出的时间延迟网络(Time Delay Neural Network, TDNN)。TDNN是一个应用于语音识别问题的卷积神经网络,使用FFT预处理的语音信号作为输入,其隐含层由2个一维卷积核组成,以提取频率域上的平移不变特征。由于在TDNN出现之前,人工智能领域在反向传播算法(Back-Propagation, BP)的研究中取得了突破性进展,因此TDNN得以使用BP框架内进行学习。在原作者的比较试验中,TDNN的表现超过了同等条件下的隐马尔科夫模型(Hidden Markov Model, HMM),而后者是二十世纪80年代语音识别的主流算法。

1988年,Wei Zhang提出了第一个二维卷积神经网络:平移不变人工神经网络(SIANN),并将其应用于检测医学图像。独立于Zhang(1998),Yann LeCun在1989年同样构建了应用于图像分类的卷积神经网络,即LeNet的最初版本LeNet包含两个卷积层,2个全连接层,共计6万个学习参数,规模远超TDNN和SIANN,且在结构上与现代的卷积神经网络十分接近。LeCun (1989)对权重进行随机初始化后使用了随机梯度下降(Stochastic Gradient Descent, SGD)进行学习,这一策略被其后的深度学习研究广泛采用。此外,LeCun (1989)在论述其网络结构时首次使用了“卷积”一词,“卷积神经网络”也因此得名。

LeCun (1989)的工作在1993年由贝尔实验室(AT&T Bell Laboratories)完成代码开发并被大量部署于NCR(National Cash Register Coporation)的支票读取系统。但总体而言,由于数值计算能力有限、学习样本不足,加上同一时期以支持向量机(Support Vector Machine, SVM)为代表的核学习(kernel learning)方法的兴起,这一时期为各类图像处理问题设计的卷积神经网络停留在了研究阶段,没有得到广泛应用

在LeNet的基础上,1998年Yann LeCun及其合作者构建了更加完备的卷积神经网络LeNet-5并在手写数字的识别问题中取得成功LeNet-5沿用了LeCun (1989) 的学习策略并在原有设计中加入了池化层对输入特征进行筛选。LeNet-5及其后产生的变体定义了现代卷积神经网络的基本结构,其构筑中交替出现的卷积层-池化层被认为有效提取了输入图像的平移不变特征。LeNet-5的成功使卷积神经网络的应用得到关注,微软在2003年使用卷积神经网络开发了光学字符读取(Optical Character Recognition, OCR)系统。其它基于卷积神经网络的应用研究也得到展开,包括人像识别、手势识别等。

在2006年深度学习理论被正式提出后,卷积神经网络的表征学习能力得到了关注,并随着数值计算设备的更新开始快速发展。自2012年的AlexNet开始,卷积神经网络多次成为ImageNet大规模视觉识别竞赛(ImageNet Large Scale Visual Recognition Challenge, ILSVRC)的优胜算法,包括2013年的ZFNet  、2014年的VGGNet、GoogLeNet和2015年的ResNet。

 

二、基于VGGNet-16的卷积神经网络的结构

 

VGGNet由牛津大学的视觉几何组(Visual Geometry Group)提出,是ILSVRC-2014中定位任务第一名和分类任务第二名。其突出贡献在于证明使用很小的卷积(3*3),增加网络深度可以有效提升模型的效果,而且VGGNet对其他数据集具有很好的泛化能力。

如今,卷积神经网络已经成为计算机视觉领域的常用工具,所以有很多人尝试改善2012年提出的AlexNet来实现更好的效果。比如,在ILSVRC中-2013中表现最好的ZFNet在第一卷积层使用更小的卷积(receptive window size)和更小的步长(stride)。另一种策略是多尺度地在整张图像上密集训练和测试。VGGNet则强调了卷积神经网络设计中另一个重要方面——深度。

VGG比较出名的是VGG-16和VGG-19,最常用的是VGG-16。各种VGG的网络结构如下:

VGG卷积神经网络的结构

其中,第C列就是在本文中所选用的VGG-16的网络结构,可以看出VGG-16的卷积神经网络分为多层卷积接池化层,最后通过全连接层经由输出层输出分类结果。

 

三、Mnist手写数字数据集介绍

 

MINST数据库是由Yann提供的手写数字数据库文件,包含70000张手写数字图片和标签,每张图片尺寸为28x28,为了更直观地展示使用的数据集,我采用了PCA降维技术将其映射在三维坐标系中,如图3.1所示。在本次实验中,我们将数据集分成训练集、测试集以及验证集,其中,训练集数据有55000张图片,测试集数据占10000张图片,验证集有5000张图片。

图3.1 Mnist手写数据集三维分布图

 

 

四、基于VGG-16卷积神经网络的训练过程

4.1 训练参数设置

本文实验训练参数设置为:1)学习率:在经过了大量的实验验证后,本实验将基础学习率设为0.0001,学习率衰减率设为0.000001,衰减步长设为1000;2)学习步数:学习总步数设为20000步;3)训练批次:为了更好的训练性能,本实验将训练批次设为500。

图4.1 网络的损失函数曲线图
图4.2 网络的预测精度曲线图

 

在整个训练过程中,我们网络的损失函数和预测精度如图4.1和4.2所示,我们可以看到该网络的损失函数cross_entropy从第0步开始到第20000步处于一个单调下降的趋势,在14000步之后基本保持1.483不变,而对测试集的预测精度从第0步开始到第20000步处于一个单调上升的趋势,在14000步之后基本保持0.9787不变。

为了方便研究卷积神经网络中的各参数的变化会对网络的精度存在一定的影响,在这里,我使用了Tensorflow中的数据可视化工具Tensorboard将网络中的各个节点参数的变化记录在log事件中,得到了图4.3。

图4.3 卷积层、全连接层以及输出层的各权重和偏移量的变化直方图

其中,卷积神经网络的各层之间的权重和偏移量的变化如图3.所示,其中,图3.7(a)为卷积层1中的激活函数、权重以及偏移量的变化曲线,图3.7(b)为卷积层2中的激活函数、权重以及偏移量的变化曲线,图3.7(c)为卷积层3中的激活函数、权重以及偏移量的变化曲线,图3.7(d)为卷积层4中的激活函数、权重以及偏移量的变化曲线,图3.7(e)为全连接层1中的激活函数、权重以及偏移量的变化曲线,图3.7(f)为卷积层全连接层2中的激活函数、权重以及偏移量的变化曲线,图3.7(g)为输出层中的激活函数、权重以及偏移量的变化曲线。

 

五、实验结果分析

在本节中,通过加载训练好的网络模型,将该模型用于Mnist手写数字的10000张测试集中,实验结果显示,有217张图片识别错误,9783张图片识别正确,识别率高达97.83%。在图5.1中随机展示了25张识别有误的图片,“T”代表的是属于这张图片的真实标签,“P”代表的是属于这张图片的预测标签;图5.2中展示了随机从10000张测试集图片中抽取了25张识别结果图,可以看出,卷积神经网络对手写数字的分类效果是相当好的,除了一些意义模糊的图片没有识别出来。

图5.1 卷积神经网络预测有误的图像
图5.2 卷积神经网络预测样本

为了研究方便,本文作者写了一个python的类,用于对模型进行性能上的评估,其中,精确率(Precision)、召回率(Recall)、F-Score、准确率(Accuracy)我将会在下一篇博客中为大家详细解释。

图5.3 卷积神经网络的Precision-Recall曲线

 

 

六、部分代码展示

 

 

 

 

 

 

 

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一个简单的卷神经网络模型,用于识别MNIST数字。该模型使用TensorFlow框架实现。 首先,您需要导入必要的库和数据集: ```python import tensorflow as tf from tensorflow.keras.datasets import mnist # load the dataset (x_train, y_train), (x_test, y_test) = mnist.load_data() ``` 接下来,您需要对数据进行预处理。将像素值缩放到0到1之间,并将标签转换为one-hot编码。 ```python # normalize pixel values to 0-1 x_train, x_test = x_train / 255.0, x_test / 255.0 # convert labels to one-hot encoding y_train = tf.keras.utils.to_categorical(y_train, 10) y_test = tf.keras.utils.to_categorical(y_test, 10) ``` 然后,您可以定义卷神经网络模型。该模型包含两个卷层和两个全连接层。 ```python model = tf.keras.models.Sequential([ tf.keras.layers.Reshape((28, 28, 1), input_shape=(28, 28)), tf.keras.layers.Conv2D(32, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Conv2D(64, (3, 3), activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), tf.keras.layers.Flatten(), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10, activation='softmax') ]) ``` 最后,您可以编译和训练模型,并在测试集上测试模型的性能。 ```python # compile the model model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # train the model model.fit(x_train, y_train, epochs=5, validation_data=(x_test, y_test)) # evaluate the model on test set test_loss, test_acc = model.evaluate(x_test, y_test) print(f"Test accuracy: {test_acc}") ``` 这就是一个简单的卷神经网络模型,用于识别MNIST数字。您可以根据需要对其进行修改和调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值