背景
卷积神经网络(Convolutional Neural Networks CNNs/ConvNets)与普通神经网络非常相似,它们都由具有可学习的权重和偏置常量(biases)的神经元组成。输出是每个分类的分数,目标函数是交叉熵损失函数,参数以及偏置采用SGD进行反向训练。 分两个部分,部分一介绍基础知识,部分二介绍CNN历史。
部分一:基础知识
1. 卷积神经网络的层级结构:
l 数据输入层- Input layer;
l 卷积计算层- conv layer,主要包含:
卷积计算层- conv layer;
激励层-ReLU layer;
池化层-Pooling layer;
l 全连接层-FC layer。
顺序为:输入-(卷积-BN-激活-池化)-全连接(Dropout)-输出
网络结构如下:
2. 下面按照CNN层级结构逐步介绍:
2.1 数据输入层
与一般数据处理大体相似,比如去均值(中心化),归一化等,并且尽量能够被2整除,比如32,64,96,224。
2.2 卷积计算层
卷积层计算流程:
首先,通过局部关联,进行单个卷积。每一个卷积核(过滤器,filter)相当于一个特征提取器,一般大小为22depth(其中depth为上一层的depth)。举例:假若上一层为输入层depth=3,那么该一个卷积核共有12个权重:
分别与相应的数据矩阵做卷积,然后加偏执(一个卷积核只对应一个偏置),经过ReLU层,得到,公式如下:
下面介绍卷积层遇到的几个名词:
l 感受野:下一层的每个神经元与上一层的一个局部区域相关联,该链接空间的大小叫做该神经元的感受野,说白了就是卷积核(过滤器)的尺寸;在深度上和上一层的深度相同;
l 步长/stride:窗口一次滑动的长度;
l 深度/depth:例如前提条件里的输入数据深度为3。再例如下图,输出层的深度与卷积核的数量相同
l 填充值/zero-padding:一般在外围填充0,由于一般只通过卷积层和ReLU层之后数据的(宽高)不变,填充的目的就是使数据(宽高)不变。如下图,填充之后:
2.3 激励层
一般激励层归于卷积层。该层就是把卷积层输出结果做非线性映射:
CNN一般采用ReLU(修正线性单元),图像如下:
2.4 池化层
池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。池化层的具体作用:
-
特征不变性:也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。
-
特征降维:我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。
-
在一定程度上防止过拟合,更方便优化。
2.5 全连接层
全连接层将两层之间所有神经元都有权重连接,再加上偏置(提高泛化)通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:
一般会引入Dropout和全局平均池化,防止过拟合。
注
-
如果将CNN考虑成平常的神经元的形式。将卷积层转换成全连接层:则该全连接层的权重是一个巨大矩阵,除了某些特定块(感受野),其余部分都是零,在非零部分,大部分元素都是相等的(权值共享);将全连接层转化为卷积层:(不太懂)。另外要把“将全连接层转化成卷积层”和“用矩阵乘法实现卷积”区别开,这两者是不同的,后者本身还是在计算卷积,只不过将其展开为矩阵相乘的形式,并不是”将全连接层转化成卷积层”。
-
用矩阵乘法实现卷积
卷积运算本质上就是在滤波器和输入数据的局部区域间做点积。卷积层的常用实现方式就是利用这一点,将卷积层的前向传播变成一个巨大的矩阵乘法。
(1) 输入图像的局部区域被
im2coim2co l操作拉伸为列。比如输入是[227x227x3],要与尺寸为11x11x3的滤波器以步长为4进行卷积,就依次取输入中的[11x11x3]数据块,然后将其拉伸为长度为11x11x3=363的列向量。重复进行这一过程,因为步长为4,所以经过卷积后的宽和高均为(227-11)/4+1=55,共有55x55=3,025个个神经元。因为每一个神经元实际上都是对应有 363 的列向量构成的感受野,即一共要从输入上取出 3025 个 363 维的列向量。所以经过im2col操作得到的输出矩阵 XcolXcol 的尺寸是[363x3025],其中每列是拉伸的感受野。注意因为感受野之间有重叠,所以输入数据体中的数字在不同的列中可能有重复。
(2) 卷积层的权重也同样被拉伸成行。举例,如果有96个尺寸为[11x11x3]的滤波器,就生成一个矩阵WrowWrow,尺寸为[96x363]。
(3) 现在卷积的结果和进行一个大矩阵乘法 np.dot(Wrow,Xcol)np.dot(Wrow,Xcol) 是等价的了,能得到每个滤波器和每个感受野间的点积。在我们的例子中,这个操作的输出是[96x3025],给出了每个滤波器在每个位置的点积输出。注意其中的
np.dotnp.dot计算的是矩阵乘法而不是点积。
(4) 结果最后必须被重新变为合理的输出尺寸[55x55x96]。
部分二:
-
CNN常用框架:Caffe、Torch、TensorFlow。
-
下面是卷积神经网络领域中比较有名的几种结构:
l LeNet ,第一个成功的卷积神经网络应用,是Yann LeCun在上世纪90年代(1998年)实现的。当然,最著名还是被应用在识别数字和邮政编码等的LeNet结构。
l AlexNet,AlexNet卷积神经网络在计算机视觉领域中受到欢迎,它由Alex Krizhevsky,Ilya Sutskever和Geoff Hinton实现。AlexNet在2012年的ImageNet
ILSVRC 竞赛中夺冠,性能远远超出第二名(16%的top5错误率,第二名是26%的top5错误率)。这个网络的结构和LeNet非常类似,但是更深更大,并且使用了层叠的卷积层来获取特征(之前通常是只用一个卷积层并且在其后马上跟着一个汇聚层)。
l ZF Net ,Matthew Zeiler和Rob Fergus发明的网络在ILSVRC
2013比赛中夺冠,它被称为 ZFNet(Zeiler& Fergus Net的简称)。它通过修改结构中的超参数来实现对AlexNet的改良,具体说来就是增加了中间卷积层的尺寸,让第一层的步长和滤波器尺寸更小。
l GoogLeNet,ILSVRC 2014的胜利者是谷歌的Szeged等实现的卷积神经网络。它主要的贡献就是实现了一个奠基模块,它能够显著地减少网络中参数的数量(AlexNet中有60M,该网络中只有4M)。还有,这个论文中没有使用卷积神经网络顶部使用全连接层,而是使用了一个平均汇聚,把大量不是很重要的参数都去除掉了。GooLeNet还有几种改进的版本,最新的一个是Inception-v4。
l VGGNet ,ILSVRC 2014的第二名是Karen Simonyan和 Andrew
Zisserman实现的卷积神经网络,现在称其为VGGNet。它主要的贡献是展示出网络的深度是算法优良性能的关键部分。他们最好的网络包含了16个卷积/全连接层。网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2的汇聚。他们的预训练模型是可以在网络上获得并在Caffe中使用的。VGGNet不好的一点是它耗费更多计算资源,并且使用了更多的参数,导致更多的内存占用(140M)。其中绝大多数的参数都是来自于第一个全连接层。后来发现这些全连接层即使被去除,对于性能也没有什么影响,这样就显著降低了参数数量。
l ResNet ,残差网络(Residual Network)是ILSVRC2015的胜利者,由何恺明等实现。它使用了特殊的跳跃链接,大量使用了批量归一化(batch normalization)。这个结构同样在最后没有使用全连接层。读者可以查看何恺明的的演讲(视频,PPT),以及一些使用Torch重现网络的实验。ResNet当前最好的卷积神经网络模型(2016年五月)。何开明等最近的工作是对原始结构做一些优化,可以看论文Identity Mappings in Deep Residual Networks,2016年3月发表。
卷积神经网络历史回顾:参考博客
https://blog.csdn.net/jiaoyangwm/article/details/80011656
https://www.cnblogs.com/adong7639/p/9554915.html