卷积神经网络(CNN)初识

卷积神经网络(CNN)初识
这是第一次写博客,也是白嫖了几年后的第一次记录。
最近公司做了很多卷积神经网络相关的工作,检测和识别图像相关工作。同事也经常问我卷积神经网络是什么,原理是什么。说实话,我虽然写了很多卷

积神经网络的代码(基本上都是直接调用和改参数),但是说到细节,我自己也不是很清楚,借这次机会,整理一下卷积神经网络的基础知识。
1、定义
卷积神经网络(Convolutional Neural Networks)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。卷积神经网络的创始人是着名的计算机科学家Yann LeCun,目前在Facebook工作,他是第一个通过卷积神经网络在MNIST数据集上解决手写数字问题的人。
2、结构
神经网络都包含三层:输入层、隐藏层和输出层。

输入层
与传统神经网络输入层不同的是,卷积神经网络输入层可以处理多维数据,常见地,一维卷积神经网络的输入层接收一维或二维数组,其中一维数组通常为时间或频谱采样;二维数组可能包含多个通道;二维卷积神经网络的输入层接收二维或三维数组;三维卷积神经网络的输入层接收四维数组 。由于卷积神经网络在计算机视觉领域应用较广,因此许多研究在介绍其结构时预先假设了三维输入数据,即平面上的二维像素点和RGB通道。

隐含层
卷积神经网络的隐含层包含卷积层、池化层和全连接层3类常见构筑,在一些更为现代的算法中可能有Inception模块、残差块(residual block)等复杂构筑。在常见构筑中,卷积层和池化层为卷积神经网络特有。卷积层中的卷积核包含权重系数,而池化层不包含权重系数,因此在文献中,池化层可能不被认为是独立的层。
Convolutional layer(卷积层–CONV)
由滤波器filters和**函数构成。
一般要设置的超参数包括filters的数量、大小、步长,以及padding是“valid”还是“same”。当然,还包括选择什么**函数。
Pooling layer (池化层–POOL)
这里里面没有参数需要我们学习,因为这里里面的参数都是我们设置好了,要么是Maxpooling,要么Averagepooling。
需要指定的超参数,包括是Max还是average,窗口大小以及步长。
通常,我们使用的比较多的是Maxpooling,而且一般取大小为(2,2)步长为2的filter,这样,经过pooling之后,输入的长宽都会缩小2倍,channels不变。
Maxpooling结果如下:
卷积神经网络(CNN)初识

Fully Connected layer(全连接层–FC)
这个前面没有讲,是因为这个就是我们最熟悉的家伙,就是我们之前学的神经网络中的那种最普通的层,就是一排神经元。因为这一层是每一个单元都和前一层的每一个单元相连接,所以称之为“全连接”。
这里要指定的超参数,无非就是神经元的数量,以及**函数。
输出层
因为卷积神经网络隐藏层最后一层全连接层,因此其结构和工作原理与传统前馈神经网络中的输出层相同。对于图像分类问题,输出层使用逻辑函数或归一化指数函数(softmax function)输出分类标签 。在物体识别(object detection)问题中,输出层可设计为输出物体的中心坐标、大小和分类 。在图像语义分割中,输出层直接输出每个像素的分类结果 。

下面介绍一下卷积神经网络中的卷积怎么计算
这里借鉴一个大神的例子:
边界检测,假设我们有这样的一张图片,大小8×8:
卷积神经网络(CNN)初识
图片中的数字代表该位置的像素值,我们知道,像素值越大,颜色越亮,所以为了示意,我们把右边小像素的地方画成深色。图的中间两个颜色的分界线就是我们要检测的边界。

怎么检测这个边界呢?我们可以设计这样的一个 滤波器(filter,也称为kernel),大小3×3:

卷积神经网络(CNN)初识
然后,我们用这个filter,往我们的图片上“盖”,覆盖一块跟filter一样大的区域之后,对应元素相乘,然后求和。计算一个区域之后,就向其他区域挪动,接着计算,直到把原图片的每一个角落都覆盖到了为止。这个过程就是 “卷积”。
(我们不用管卷积在数学上到底是指什么运算,我们只用知道在CNN中是怎么计算的。)
这里的“挪动”,就涉及到一个步长了,假如我们的步长是1,那么覆盖了一个地方之后,就挪一格,容易知道,总共可以覆盖6×6个不同的区域。
卷积神经网络(CNN)初识
通过卷积计算,我们可以发现最后的矩阵数据两边颜色变浅,中间边界位置颜色变深了,这样我们就能找到图片的边界特征了。实际上卷积神经网络就是通过很多的filter来不断提取图像的特征,最后完成图像的检测识别等工作。

那么我们设计这些filter呢?

实际上这些filter对应的数据就是我们需要学习的参数,我们可以通过训练数据不断拟合更新我们的参数,最终达到我们想要的结果,这就是卷积神经网络需要做的事情。

3、卷积层参数
卷积核大小
卷积核大小可以指定为小于输入图像尺寸的任意值,卷积核越大,可提取的输入特征越复杂
卷积步长
卷积步长定义了卷积核相邻两次扫过特征图时位置的距离,卷积步长为1时,卷积核会逐个扫过特征图的元素,步长为n时会在下一次扫描跳过n-1个像素
填充(padding)
由卷积核的交叉相关计算可知,随着卷积层的堆叠,特征图的尺寸会逐步减小。因此我们经常在特征图中加入padding,这样能够抵消图像的尺寸收缩。
卷积神经网络(CNN)初识
有效填充(valid padding):即完全不使用填充,卷积核只允许访问特征图中包含完整感受野的位置。输出的所有像素都是输入中相同数量像素的函数。使用有效填充的卷积被称为“窄卷积(narrow convolution)”,窄卷积输出的特征图尺寸为(L-f)/s+1。
相同填充/半填充(same/half padding):只进行足够的填充来保持输出和输入的特征图尺寸相同。相同填充下特征图的尺寸不会缩减但输入像素中靠近边界的部分相比于中间部分对于特征图的影响更小,即存在边界像素的欠表达。使用相同填充的卷积被称为“等长卷积(equal-width convolution)”。
全填充(full padding):进行足够多的填充使得每个像素在每个方向上被访问的次数相同。步长为1时,全填充输出的特征图尺寸为L+f-1,大于输入值。使用全填充的卷积被称为“宽卷积(wide convolution)”
任意填充(arbitrary padding):介于有效填充和全填充之间,人为设定的填充,较少使用。

4、卷积神经网络的优势
参数共享(parameters sharing)
我们知道,传统神经网络的全连接层中,需要的链接个数是MN,M是上一层的神经元个数,N是这一层的神经元个数。每个链接都需要分配一个权重w,这就需要MN个权重。
而卷积神经网络的参数是可以共享的,前面的3*3的的filter就只需要9个参数,对于不同区域,我们都共享了同一个filter,因此我们共享了9个参数。因此我们可以看出,卷积神经网络大大减少了参数的数量。

连接的稀疏性(sparsity of connections)
由卷积的操作可知,输出图像中的任何一个单元,只跟输入图像的一部分有关系:
卷积神经网络(CNN)初识

只跟输入的一部分有关
而传统神经网络中,由于都是全连接,所以输出的任何一个单元,都要受输入的所有的单元的影响。这样无形中会对图像的识别效果大打折扣。比较,每一个区域都有自己的专属特征,我们不希望它受到其他区域的影响。

第一次写博客,才知道原来这么累,大部分内容都是参考下面链接,以后有时间再补充吧。
参考链接
https://www.jianshu.com/p/c0215d26d20a