基于卷积神经网络CNN识别mnist手写数字集

提示:之前已经有了基于全连接层的神经网络识别mnist手写数字集,但是识别率较低,这是必然的,这就体现出来了卷积神经网络CNN的优势所在:说其它的都是虚的,最大的优点就是效果好,分类正确率高。即使训练回合少一些,识别率依旧居高不下。
但是缺点也很明显:需要调参,需要大数据量,需要大计算量


前言

提示:21世纪开始,卷积神经网络就被成功的大量用于检测、分割、物体识别以及图像的各个领域。值得一提的是,图像可以在像素级别进行打标签,这样就可以应用在比如自动电话接听机器人、自动驾驶汽车等技术中。尽管卷积神经网络应用的很成功,但是它被计算机视觉以及机器学习团队开始重视是在2012年的ImageNet竞赛。在该竞赛中,深度卷积神经网络被用在上百万张网络图片数据集,这个数据集包含了1000个不同的类。该结果达到了前所未有的好,几乎比当时最好的方法降低了一半的错误率。成功来自有效地利用了GPU、ReLU、一个新的被称为dropout的正则技术,以及通过分解现有样本产生更多训练样本的技术。这个成功给计算机视觉带来一个革命。如今,卷积神经网络用于几乎全部的识别和探测任务中。


提示:以下是本篇文章正文内容,下面案例可供参考

一、卷积神经网络是什么?

卷积网络,也叫作卷积神经网络(convolutional neural network ,CNN),是一种专门用来处理具有类似网格结构的数据的神经网络。例如时间序列数据(可以认为是在时间轴上有规律地采样形成的一维网络)和图像数据(可以看作二维的像素网格)。卷积神经网络在诸多领域表现优异。“卷积神经网络”一词表明该网络使用了卷积这种数学运算。卷积神经网络是一种特殊的线性运算。卷积神经网络是指那些至少在网络的一层中使用卷积运算来代替一般的矩阵乘法运算的神经网络。

二、使用步骤

1.引入库

代码如下(示例):

#基于CNN的,识别率达到99.25%
from keras.utils import to_categorical
from keras import models, layers
from keras.optimizers import RMSprop
from keras.datasets import mnist

2.加载数据集

代码如下(示例):

# 加载数据集
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()#数据归一化

该处将mnist数据集进行训练集和测试集的图像和标签分类。


3.# 搭建LeNet网络

(1)LeNet-5网络

LeNet-5 模型是 Yann LeCun 教授于 1998 年在论文 Gradient-based learning applied to document recognitionr 中提出的,它是第一个成功应用于数字识别问题的卷积神经网络。在 MNIST 数据集上,LeNet-5 模型可以达到大约 99.2%的正确率。
我认为LeNet网络是卷积神经网络历史的里程碑,自它的 发表和应用,卷积神经网络开始了从理论到实践的飞跃,它的发表就是用于手写数字集的识别,以后我会转发写一篇关于LeNet网络的博文。

(2)搭建过程

代码如下(示例):

# 搭建LeNet网络
def LeNet():
    network = models.Sequential()#选择序贯模型
    network.add(layers.Conv2D(filters=6, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)))#添加卷积层,输入张量的shape
    network.add(layers.AveragePooling2D((2, 2)))#添加池化层,针对2D输入的平均池化层,指定池化窗口的大小为2,指定池操作的步幅为2
    network.add(layers.Conv2D(filters=16, kernel_size=(3, 3), activation='relu'))
    network.add(layers.AveragePooling2D((2, 2)))
    network.add(layers.Conv2D(filters=120, kernel_size=(3, 3), activation='relu'))
    network.add(layers.Flatten())#Flatten层用来将输入“压平”,即把多维的输入一维化,常用在从卷积层到全连接层的过渡。
    network.add(layers.Dense(84, activation='relu'))#添加全连接层
    network.add(layers.Dense(10, activation='softmax'))#添加输出层,softmax激活函数
    return network
network = LeNet()
network.compile(optimizer=RMSprop(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])
# 编译步骤,损失函数是模型优化的目标,优化器使用RMSporp,学习率为0.001,损失函数是categorical_crossentropy,评价函数为accuracy准确率
print(network.summary()) 

该处依然选择贯序模型(其神经网络由网络层堆叠而成。每一个网络层仅以上一层网络的输出为输入,并将经过处理后的输出送给下一层。)3层卷积,2层池化,1个Flatten层和两个全连接层.
值得注意的是卷积层的创建:
里面定义了过滤器的个数,卷积核的形状、所选用的激活函数和输入张量形状
关于filter大小的选择,一般是采取奇数的卷积核(比如3×3,5×5,7×7)
如果用偶数卷积核话 网络在进行卷积操作时很难找不到卷积的中心点,也就是偶数卷积核不对称这个问题也导致了导致在填充的(padding)的时候像素特征不断偏移.然后随着层次的加深,这个偏移现象就越来越明显。这种偏移问题,在一些任务,比如语义分割,等一些需要知道特征具体像素位置的任务中就产生了很大的影响。

神经网络结构如下图所示


在这里插入图片描述

4.编译神经网络

代码如下(示例):

network.compile(optimizer=RMSprop(lr=0.001), loss='categorical_crossentropy', metrics=['accuracy'])

编译步骤,损失函数是模型优化的目标,优化器使用RMSporp,学习率为0.001,损失函数是categorical_crossentropy,评价函数为accuracy准确率


5.数据集预处理(训练集和测试集都要)

代码如下(示例):

#将图片由二维铺开成一维
# 在向神经网络投入数据之前,将这些值标在从0到1的范围内。为此,将像素的值除以255。
 #卷积需要2维数据,还需要指定色深,因此是(样本数,长,宽,色深),数据规范化为0-1范围的浮点数
train_images = train_images.reshape((60000, 28, 28, 1)).astype('float') / 255
test_images = test_images.reshape((10000, 28, 28, 1)).astype('float') / 255
train_labels = to_categorical(train_labels)#to_categorical就是将类别向量转换为二进制(只有0和1)的矩阵类型表示。
test_labels = to_categorical(test_labels)

数据预处理在构建网络模型时是很重要的,往往能够决定训练结果。当然对于不同的数据集,预处理的方法都会有或多或少的特殊性和局限性。
(1)卷积需要2维数据,还需要指定色深,因此是(样本数,长,宽,色深),数据规范化为0-1范围的浮点数
(2)标签页要处理成二进制矩阵显示。


6.训练神经网络

代码如下(示例):

# 训练网络,用fit函数, epochs表示训练多少个回合, batch_size表示每次训练给多大的数据
network.fit(train_images, train_labels, epochs=20, batch_size=128, verbose=2)
test_loss, test_accuracy = network.evaluate(test_images, test_labels)
print("test_loss:", test_loss, "    test_accuracy:", test_accuracy)

训练步骤,同时打印损失率和识别率。


7.训练运行结果

在这里插入图片描述

总结

本文简单的复现了使用卷积神经网络进行识别手写数字集,并且识别率成功达到了惊人的99.25%,但是这是完全不足的,在kaggle上,有很多人对mnist的识别都已经达到了100%,这完全也是可以达到的,我们可以更改神经网络,更改神经网络结构,甚至换一下参数就可以对识别率进行优化。另外,我还是推荐大家看一下这位博主的博客,写的很不错,一起学习!

https://blog.csdn.net/qq_40438165/article/details/105846692

  • 1
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仓鼠球球-O-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值