前言
从初识卷积神经网络到如今也一年有余,但是每每总是粗略的知道其大概的意思:经过卷积操作可以提取图像的特征,而卷积的优越性就在于此:优异的特征提取(表达)能力,甚至超过人类的肉眼。先前的理解便止步于此,至于怎么提取特征既然交给卷积神经网络了,好像就不用再去了解它的执行原理了。于是,对于网上开源的各类优秀的网络架构,便只会根据其GitHub介绍进行按部就班的操作,以致,针对大方面:不同的网络架构不同之处?针对精度和速度划分的两大类one-stage和two-stage根本区别在于?等等……针对小方面:为什么模型针对不同场景效果不同?以及如何调节训练参数等等好似都一窍不通……仔细审视自己,在深度学习这个领域就真的只是一个路过的看客。
于是,在积累了一年或多或少粗略的知识,还是决心从头再入门一次。
1. 卷积神经网络
卷积神经网络是一种带卷积运算的神经网络结构。我们所说的卷积层是卷积神经网络中最核心的结构但不是全部,一个标准的卷积神经网络主要由卷积层、池化层和全连层构成,输入的图像一次经过若干个卷积层和池化层,最终将所提取的特征映射馈送到全连层,并由特定的分类器得到最终的输出结果。如下动画所示:
详细展开如下:
CONV:卷积层
RELU:激活函数(有多种,上述涉及的激活函数如下图所示)
POOL:池化层
FC:全连层
当然还有最前面的输入图像,以及最后的输出结果图,由于不是卷积神经网络的组成部分,不详细展开说明。
2. 卷积层
经过卷积到底是怎么提取或者说表达特征的?
如下动画:
- 首先由上述动画得知:
输入图像的尺寸为:5*5
;卷积核(kernel)的尺寸为:3*3
,其九个权重值为(1,0,1,0,1,0,1,0,1);卷积核的步幅(stride)为1
,边缘无填充(padding
= 0) 根据计算公式:(N-K+2P)/S + 1
(N:输入的图像尺寸 K:卷积核尺寸 P 边缘填充数量 S:卷积步幅) 代入计算: (5-3+0*2)/ 1+1 = 3 ,于是得到右边3*3
的特征图尺寸(图上粉色部分) -
卷积
在数学中的解释是:两个变量在某范围内相乘后求和的结果。而在深度学习中所谓卷积
之名同理:卷积核的权值与其在滑过的原图上对应位置相乘后进行累加。 - 具体来说,卷积核从输入图像的第一行第一个像素位置开始,以一定的步长,一次滑过每个像素位置,并计算滑动窗口范围内各像素的加权和,作为相应位置卷积计算结果,以此类推。卷积层具有三大特性:局部感受野、权值共享以及层次结构。每次卷积计算时,感受野的大小取决于卷积核的尺寸,在滑动窗口滑过的每个图像位置都共享相同的权重值。此外,卷积的层级结构,有助于更好地逐层图像特征信息,这正是卷积神经网络优异地特征提取能力重要原因。
上述的操作称之为一个卷积单元的卷积过程,而能称之为卷积层必然得多个卷积核同时对输入图像进行卷积操作。卷积效果随着输入图像的大小,每一个卷积核的尺寸以及卷积核数量呈线性增长,使得计算量相当庞大。
通过上述地理解,似乎对卷积操作过程有了一定地了解,但是具体实例中存在如下问题:笔者误以为,卷积过程中滤波器是 2 维的,只有宽高,通道数为 1;输入3通道的原始图像经过卷积后是如何得到多通道的?如下图:
如此看来,简单的二维解释卷积过程是不完整的,卷积核的通道数与输入层的通道数是一致的:
如上图所示:如果把输入当做一个立方体的话,那么 filter 也是一个立方体,它们卷积的结果也是一个立方体,并且上面中 input、filter、Result 的通道都是一致的。
但卷积过程的最后一步要包括生成 feature,很简单,将 Result 各个通道对应坐标的值相加就生成了 feature,相当于将多维的 Result 压缩成了 2 维的 feature。
那么为什么要将卷积后的结果压缩到2维?怎么改变输入图像的通道数获得多通道的输出结果?
答案就在于卷积层中卷积核的数量:如下图
这便解释了为什么一个卷积核的卷积结果要压缩成2维的特征图,如此就能保证输出特征图的通道数与卷积核的数量保持一致性。
综上得到结论:
卷积过程中,输入层有多少个通道,卷积核就要有多少个通道,但是卷积核的数量是任意的,卷积核的数量决定了卷积后 featuremap 的通道数。
如此一定要用三维的角度来理解卷积核
3. 池化层
池化层也是卷积神经网络中另一重要组成部分。池化层又称下采样层,顾名思义即对输入图像进行缩小操作,保留重要的特征信息。池化主要有两大操作:最大池化(max-polling)和平均池化(average-pooling),常见的池化滤波器为2*2
,stride = 2
,相当于将图像缩小了4
倍。
上述图例所示的例子:池化后的输出图像尺寸计算公式与卷积一致(除了没有边缘填充单元
)。图像尺寸为:7*7
,池化滤波器的尺寸为2*2
,stride = 2
。
(7-2)/ 2 +1 = 4(无法整除则向上取整
)
池化的作用:
- 除了上面所说的缩小图像的尺寸,那么为什么要缩小输入图像的尺寸?池化层主要连接在每层卷积层之后(上面的第二张动画图),缩小卷积之后的特征图,作为下一层卷积的输入,由此就扩大了下一次卷积操作的感受野(假设卷积核尺寸不变,由于输入图像的尺寸缩小,卷积滤波器窗口将覆盖的面积占原图的比重变大)。池化层操作后所谓的缩小:是用更具代表(最大值或平均值)的特征代替池化滤波器窗口所覆盖区域的其他特征,由此保留显著特征而剔除冗余特征,为下一层的卷积操作提供更加显著的特征图,并在一定程度上减少了下层卷积计算量。
4. 全连接层
全连接层是一种密集连接的网络解构,层间每个神经元节点都与上一层的所有节点相连。其主要用于将卷积特征进行压缩或拉伸,变换特征的维度并映射到蒂维向量空间,全连接层输出向量长度等于神经元的数量。
再看上图所示图像的特征提取过程,结合上述理解卷积和池化过程及其输出的图像尺寸的计算。
5. 参数数量统计
parameters = weights + biases
1. 卷积层参数数量:
其中:
- Wcf= weights的数量
- Bcf= biases的数量
- O= 前卷积层的输出图像的尺寸
- N = 前卷积层的核数量
- F =全连接层的神经元数量
2. 池化层参数数量: 没有与MaxPool layer相关的参数量.尺寸,步长和填充数都是超参数.
3. 全连接层参数数量:
其中:
- Wcf= weights的数量
- Bcf= biases的数量
- O= 前卷积层的输出图像的尺寸
- N = 前卷积层的核数量
- F = 全连接层的神经元数量
- Wff= weights的数量
- Bff= biases的数量
- Pff= 总参数的数量
- F= 当前FC层的神经元数量
- F-1 = 前FC层的神经元数量
参考连接
[1]https://www.jianshu.com/p/fe428f0b32c1[2][3]
后言
看到最后,相信一定会有读者想问,接触卷积神经网络一年多又开始重新学过,为什么不一开始接触就认真学下来呢。当然对于理解能力比较强的人,或是有一定相关知识储备的人可以做到从接触到一步步深入理解。但是对于博主(本科传统交通方向)从研究生才开始接触深度学习以及各种计算机等编程知识的小白来说,没有一年多广泛浅尝地学习,很多相关领域地专有概念光是知道它的解释是没有用的,包括很多相关的博客写得十分生动易懂,但对于博主来说还是难懂。因为基础的知识储备还没有达到理解的要求,门槛都未够到,谈何入门。经过一年多的知识储备,不能说已经入门了,但是对于同一篇博客(关于深度学习),文中涉及相关概念,不再是一个简单的名词或是动词,能联想到它可能的结构或是应该执行的某种操作,能理解获得某种结果一定原理和依据。当然学无止境,温故知新!!