1. 基础概念
卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。
卷积神经网络是一种多层神经网络,擅长处理图像特别是大图像的相关机器学习问题。CNN最早由Yann LeCun提出并应用在手写字体识别上(MINST)。LeCun提出的网络称为LeNet。这是一个最典型的卷积网络,由卷积层、池化层、全连接层组成。其中卷积层与池化层配合,组成多个卷积组,逐层提取特征,最终通过若干个全连接层完成分类。
CNN通过卷积来模拟特征区分,并且通过卷积的权值共享及池化,来降低网络参数的数量级,最后通过传统神经网络完成分类等任务。
1. 参数降级
如果我们使用传统神经网络方式,对一张图片进行分类,把图片的每个像素作为一个输入单元,连接到隐藏层节点上,假设隐藏层有1000个节点,那么对于一张1000 * 1000像素的图片,一共有个参数,这显然是不能接受的。
但是我们在CNN里,可以大大减少参数个数,我们基于以下两个假设:
1)最底层特征都是局部性的,也就是说,我们用10x10这样大小的过滤器就能表示边缘等底层特征
2)图像上不同小片段,以及不同图像上的小片段的特征是类似的,也就是说,我们能用同样的一组分类器来描述各种各样不同的图像
基于以上两个假设,我们可以使用卷积神经网络来减少参数个数。
2. 卷积
如上图所示I是输入图片像素,K是Filter,以上运算称为卷积运算。卷积运算从图片左上角开始,选取f*f大小的区域,与filter进行如下运算:
并将计算结果放置到对应的位置上。依次从左向右、从上到下移动stride步长。最终输出结果的维度为:
上述公式中,m、f、s分别是输入、filter和步长,p标识padding,为了避免每次卷积运算后,图片大小缩小,可以往图片上追加padding。
3. 池化
常用的池化(Pooling)方法有最大化(Max)和平均(Average),如下如所示:
4. 全连接
卷积神经网络的最后,一般采用全连接层(Fully Connected Layer),也就是一个简单的申请网络,基于卷积层提取的特征,进行分类或识别。一个CNN神经网络的模型如下图所示:
可以看到,一张图片通常经过多层的卷积和池化操作后,进入到全连接层(小型的神经网络),全连接层基于以上提取的特征,对图片进行分类。
2. LeNet神经网络
下面是LeNet的模型结构:
输入:32*32的手写字体图片,这些手写字体包含数字0~9。
输出:图片中的数字:0~9之间的一个数。
LeNet-5包含以下各层:
1. Input(输入层)
手写数字图像,像素:
2. C1层
采用6个过滤器,每个过滤器大小为 ,步长为1,执行卷积计算后变为
。
Fileter:
Stride: 1
3. S2层
池化层,采用的最大化池进行运算,步长为2,执行池化操作后变为:
4. C3层
采用16个过滤器,每个过滤器大小为 ,步长为1,执行卷积计算后变为
。
5. S4层
池化层,采用的最大化池进行运算,步长为2,执行池化操作后变为:
6. C5层
采用120个过滤器,每个过滤器大小为 ,步长为1,执行卷积计算后变为
。
7. F6层
全连接层,以C5层的输出为作为输入,输出节点个数为84,执行以下运算:
8. Output(输出层)
LeNet5包含数字1-10,也就是十个类别,所以输出层采用softMax。
3. AlexNet神经网络
下面是AlexNet的模型结构:
输入:227*227*3的图片。
输出:图片分类,共1000类别。
AlexNet为8层结构,其中前5层为卷积层,后面3层为全连接层;学习参数有6千万个,神经元有650,000个;AlexNet在两个GPU上运行,共包含以下各层:
1. 第一层
卷积层:第一层输入数据为227*227*3的图像,这个图像被11*11*3的卷积核进行卷积运算。卷积核的步长为4个像素。由于第一层有96个卷积核,所以就会形成55*55*96个像素层。系统是采用双GPU处理,因此分为2组数据:55*55*48的像素层数据。
pool池化层:这些像素层还需要经过pool运算(池化运算)的处理,池化运算的尺度由预先设定为3*3,运算的步长为2,则池化后的图像的尺寸为:(55-3)/2+1=27。即经过池化处理过的规模为27*27*96.
局部响应归一化层(LRN):最后经过局部响应归一化处理,归一化运算的尺度为5*5;第一层卷积层结束后形成的图像层的规模为27*27*96.分别由96个卷积核对应生成,这96层数据分为2组,每组48个像素层,每组在独立的GPU下运算。
2. 第二层
第二层输入数据为第一层输出的27*27*96的像素层,分为2组像素数据,两组像素数据分别在两个不同的GPU中进行运算。每组像素数据被5*5*48的卷积核进行卷积运算,同理按照第一层的方式进行:(27-5+2*2)/1+1=27个像素,一共有256个卷积核,这样也就有了27*27*128两组像素层。
重叠pool池化层:同样经过池化运算,池化后的图像尺寸为(27-3)/2+1=13,即池化后像素的规模为2组13*13*128的像素层。
局部响应归一化层(LRN):最后经过归一化处理,分别对应2组128个卷积核所运算形成。每组在一个GPU上进行运算。即共256个卷积核,共2个GPU进行运算。
3.第三层
第三层输入数据为第二层输出的两组13*13*128的像素层(为方便后续处理,这对每幅像素层进行像素填充),分为2组像素数据,两组像素数据分别在两个不同的GPU中进行运算。每组像素数据被3*3*128的卷积核(两组,一共也就有3*3*256)进行卷积运算,同理按照第一层的方式进行:(13-3+1*2)/1+1=13个像素,一共有384个卷积核,这样也就有了13*13*192两组像素层。
4. 第四层
第四层输入数据为第三层输出的两组13*13*192的像素层(为方便后续处理,这对每幅像素层进行像素填充),分为2组像素数据,两组像素数据分别在两个不同的GPU中进行运算。每组像素数据被3*3*192的卷积核进行卷积运算,同理按照第一层的方式进行:(13-3+1*2)/1+1=13个像素,一共有384个卷积核,这样也就有了13*13*192两组像素层。
5. 第五层
第五层输入数据为第四层输出的两组13*13*192的像素层(为方便后续处理,这对每幅像素层进行像素填充),分为2组像素数据,两组像素数据分别在两个不同的GPU中进行运算。每组像素数据被3*3*192的卷积核进行卷积运算,同理按照第一层的方式进行:(13-3+1*2)/1+1=13个像素,一共有256个卷积核,这样也就有了13*13*128两组像素层。
重叠pool池化层:进过池化运算,池化后像素的尺寸为(13-3)/2+1=6,即池化后像素的规模变成了两组6*6*128的像素层,共6*6*256规模的像素层。
6.第六层
第6层输入数据的尺寸是6*6*256,采用6*6*256尺寸的滤波器对第六层的输入数据进行卷积运算;每个6*6*256尺寸的滤波器对第六层的输入数据进行卷积运算生成一个运算结果,通过一个神经元输出这个运算结果;共有4096个6*6*256尺寸的滤波器对输入数据进行卷积,通过4096个神经元的输出运算结果;然后通过ReLU激活函数以及dropout运算输出4096个本层的输出结果值。
很明显在第6层中,采用的滤波器的尺寸(6*6*256)和待处理的feature map的尺寸(6*6*256)相同,即滤波器中的每个系数只与feature map中的一个像素值相乘;而采用的滤波器的尺寸和待处理的feature map的尺寸不相同,每个滤波器的系数都会与多个feature map中像素相乘。因此第6层被称为全连接层。
7. 第七层
第6层输出的4096个数据与第7层的4096个神经元进行全连接,然后经由ReLU和Dropout进行处理后生成4096个数据。
8. 第八层
第7层输入的4096个数据与第8层的1000个神经元进行全连接,经过训练后输出被训练的数值。
4. Residual network
在了解残差网络之前,先了解下面这个问题,神经网络越深越好吗?
在训练集上,传统神经网络越深效果不一定越好。而Deep Residual Learning for Image Recognition 这篇论文认为,理论上,可以训练一个 shallower 网络,然后在这个训练好的 shallower 网络上堆几层 identity mapping(恒等映射) 的层,即输出等于输入的层,构建出一个 deeper 网络。这两个网络(shallower 和 deeper)得到的结果应该是一模一样的,因为堆上去的层都是 identity mapping。这样可以得出一个结论:理论上,在训练集上,Deeper 不应该比 shallower 差,即越深的网络不会比浅层的网络效果差。但为什么会出现随着层数的增多,训练集上的效果变差?这被称为退化问题(degradation problem),原因是随着网络越来越深,训练变得原来越难,网络的优化变得越来越难。理论上,越深的网络,效果应该更好;但实际上,由于训练难度,过深的网络会产生退化问题,效果反而不如相对较浅的网络。而残差网络就可以解决这个问题,残差网络越深,训练集上的效果会越好。
残差网络通过加入 shortcut connections,变得更加容易被优化。包含一个 shortcut connection 的几层网络被称为一个残差块(residual block),如图 2 所示。
如上图所示,x 表示输入,F(x) 表示残差块在第二层激活函数之前的输出,即,其中
,
和
,
表示第一层和第二层的权重和偏差,
表示 ReLU 激活函数。最后残差块的输出是
。
5. VGG
卷积神经网络的深度增加和小卷积核的使用对网络的最终分类识别效果有很大的作用。
名称 | 说明 |
输入图像大小 | 224*224*3 |
预处理 | 减去均值 |
卷积核 | 3*3 |
Padding | 1 |
Max Pooling | 2*2, stride:2 |
激活函数 | Relu |
Batch Size | 256 |
Momentum | 0.9 |
Learning Rate |
|
VGG神经网络统一采用3*3的卷积核,降低了模型的复杂度与网络参数的个数。
正则化方法:
-
增加了对权重的正则化:
-
对FC全连接层进行dropout正则化,dropout ratio = 0.5