一、CNN算法导入
CNN∈深度学习
在前面推文我们曾介绍过两种算法在手写数字识别方面的应用:K近邻算法(KNN)和支持向量机(SVM);本期,我们介绍一种更为强大的算法来识别手写数字——卷积神经网(CNN)。卷积神经网络属于深度学习的范畴,是一种前馈型人工神经网络,已成功地应用于图像识别。说到这里,大家可能会疑惑,对于同一个分类任务,我们既然可以用机器学习的算法来做,为什么要用神经网络呢?大家回顾一下,一个分类任务,如果用机器学习算法来做,首先要明确feature和label,然后把这个数据'灌'到算法里去训练,最后保存模型,再来预测分类的准确性。但这就会出现问题,即我们需要确定好特征。如果特征数目过少,我们可能无法实现精确的分类(欠拟合);如果特征数目过多,可能会导致我们在分类过程中过于注重某个特征导致分类错误(过拟合)。然而神经网络的出现使我们不需要做大量的特征工程就可以直接把数据灌进去,让数据自己训练,自我“修正”,最终就可得到一个较好的效果。
二、CNN原理
2.1 简介
CNN和普通的神经网络具有许多相似之处,它们都是模仿人类神经的结构,由具有可学习的权重和偏置常数的神经元组成。每一个神经元可以接收输入信号,经过运算后输出每一个分类的分数。但是,CNN的输入一般是图像,卷积网络通过一系列方法,成功将数据量庞大的图像识别问题不断降维,最终使其能够被训练。CNN利用该特点,把神经元设计成具有三个维度:width(图像宽度), height(图像长度), depth(红、绿、蓝3种颜色通道)。
![40f22e8871e16838ae64787b521cc5cf.png](https://img-blog.csdnimg.cn/img_convert/40f22e8871e16838ae64787b521cc5cf.png)
传统神经网络(左)和卷积神经网络(右)
下面我们简单地介绍一下卷积神经网络基本结构。
2.2 CNN基本结构
卷积神经网络通常包括以下几种"层":
(1)卷积层(Convolutional layer),卷积神经网路中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网络能从低级特征中迭代提取更复杂的特征。
![c3d999d334f97731917efa567069240c.png](https://img-blog.csdnimg.cn/img_convert/c3d999d334f97731917efa567069240c.png)
4*4 image与两个2*2的卷积核操作结果
(2)池化层(Pooling layer),即层下采样的过程,目的是为了减少特征图。通常在卷积层之后会得到维度很大的特征,将特征切成几个区域,取其最大值或平均值,得到新的、维度较小的特征。
![6dee47e706d00fa4db56d68da93f8dc2.png](https://img-blog.csdnimg.cn/img_convert/6dee47e706d00fa4db56d68da93f8dc2.png)
保证画质的前提下减少参数(图片尺寸3*3→2*2)
(3)全连接层( Fully-Connected layer), 把所有局部特征结合变成全局特征,用来计算最后每一类的得分。
![62cf6fadb518a7b81c7c3e0463995e0f.png](https://img-blog.csdnimg.cn/img_convert/62cf6fadb518a7b81c7c3e0463995e0f.png)
实现最终分类
三.CNN应用—手写数字识别
上面我们了解了卷积神经网络的基本结构和工作原理,现在我们回到最开始的例子,应用CNN来实现手写数字识别。我们利用一个五层的卷积神经网络,在进行代码介绍之前,我们通过一个简洁的例子对手写识别的原理进行三维展示:
http://scs.ryerson.ca/~aharley/vis/conv/(大家可自行至该网站进行实践,通过对该3D图形进行旋转,了解其原理)。
![205e7469fa8b8ddd7d43a631266bfa73.png](https://img-blog.csdnimg.cn/img_convert/205e7469fa8b8ddd7d43a631266bfa73.png)
3.1导入所需模块
![165b8b1a18edd4618f3efbf516d7a1be.png](https://img-blog.csdnimg.cn/img_convert/165b8b1a18edd4618f3efbf516d7a1be.png)
3.2读取文件并做相应处理:
A.读取文件
![6d8ae4393412fa4c9c8a68f4d18cd6c8.png](https://img-blog.csdnimg.cn/img_convert/6d8ae4393412fa4c9c8a68f4d18cd6c8.png)
B.做直方图
![c03be7c1ce2314cc9691ebead03904f8.png](https://img-blog.csdnimg.cn/img_convert/c03be7c1ce2314cc9691ebead03904f8.png)
输出结果为
![6d35e6e7c50d48193032fbfec0b5a986.png](https://img-blog.csdnimg.cn/img_convert/6d35e6e7c50d48193032fbfec0b5a986.png)
![02514773342cf167018811273b104196.png](https://img-blog.csdnimg.cn/img_convert/02514773342cf167018811273b104196.png)
C.归一化处理
![7cd61daeffba0b9b9267b1ca5e5428f9.png](https://img-blog.csdnimg.cn/img_convert/7cd61daeffba0b9b9267b1ca5e5428f9.png)
D.Reshape & Encode
训练集与测试集中的图片像素为28*28。而计算机在读取图片时,读取结果是一个具有784个数值的一维矩阵,因此我们需要将所有的数据转化为28*28*1的三维矩阵。(对于RGB图片来说,则需要转化为28*28*3的三维矩阵)。
原始图片的标签是数字0-9,我们需要对这些标签进行one-hot编码使其成为一个十维的向量。(例如:标签为数字2,进行one-hot编码后变为[0,0,1,0,0,0,0,0,0,0])。
![24c98fe475d3c3ca00f0a909f5962788.png](https://img-blog.csdnimg.cn/img_convert/24c98fe475d3c3ca00f0a909f5962788.png)
E.对训练集进行分割
将训练集进行分割,其中10%作为验证集进行模型评估,90%用于训练模型。在2.A部分的直方图可以看到我们的数据较为平衡,因此可以直接对数据进行分割。
![eec09b329eb2c77d985f3073df64dd12.png](https://img-blog.csdnimg.cn/img_convert/eec09b329eb2c77d985f3073df64dd12.png)
3.3 CNN
A.定义模型
从之前的介绍中,我们应该已经对卷积层和池化层的作用及原理有了大概的了解。将二者结合使用,CNN就可以更准确地学习到最主要的特征。
![01a3f7d714447d0f11fd702cf42f5038.png](https://img-blog.csdnimg.cn/img_convert/01a3f7d714447d0f11fd702cf42f5038.png)
B.设置优化器
![200b10f2ea73ed7a9f995d381c72fa88.png](https://img-blog.csdnimg.cn/img_convert/200b10f2ea73ed7a9f995d381c72fa88.png)
C.训练神经网络
![0f9cb7645f4d2d035958efa2a6f11bf6.png](https://img-blog.csdnimg.cn/img_convert/0f9cb7645f4d2d035958efa2a6f11bf6.png)
![c4a631ede21a50d40d1bf61c800c639e.png](https://img-blog.csdnimg.cn/img_convert/c4a631ede21a50d40d1bf61c800c639e.png)
3.4 模型评价
![94944fae2a2dac20210062c31ca5cdd8.png](https://img-blog.csdnimg.cn/img_convert/94944fae2a2dac20210062c31ca5cdd8.png)
![7b38cd676668a2801fd7d4af2a1dcabf.png](https://img-blog.csdnimg.cn/img_convert/7b38cd676668a2801fd7d4af2a1dcabf.png)
![cf4dacd87d1c54777933beda3db0673a.png](https://img-blog.csdnimg.cn/img_convert/cf4dacd87d1c54777933beda3db0673a.png)
![8c4842373e65630479bf383c9d60b239.png](https://img-blog.csdnimg.cn/img_convert/8c4842373e65630479bf383c9d60b239.png)
![5350e6ff59fb7402f181f1582bff433a.png](https://img-blog.csdnimg.cn/img_convert/5350e6ff59fb7402f181f1582bff433a.png)
![d519a29353a4c2ff7483f4c69eab3c2b.png](https://img-blog.csdnimg.cn/img_convert/d519a29353a4c2ff7483f4c69eab3c2b.png)
![7f630151d79d08fa6a24abd1b62f00d9.png](https://img-blog.csdnimg.cn/img_convert/7f630151d79d08fa6a24abd1b62f00d9.png)
长按识别关注我们
责编 | 薛 申 栾
![eec4f0420de6189c2bb86aca88a6ce03.png](https://img-blog.csdnimg.cn/img_convert/eec4f0420de6189c2bb86aca88a6ce03.png)
点击下方
下载代码包,提取码:ovg4