【DL-CV】卷积神经网络

【DL-CV】神经网络的补充<前篇---后篇>【DL-CV】数据预处理&权重初始化segmentfault


经典神经网络搞明白后,咱们接下来看看他的变种,也是本系列的主角——卷积神经网络(Convolutional Neural Network/CNN)。
以往全链接层组成的神经网络有一个很气人的缺点就是对付大图像效果很差:图像尺寸一大,由于权重(形状上的)大小与图像尺寸有关系,参数量激增,致使效率低下。相比,卷积神经网络就没有这种烦人的特性了,他大大下降了网络中的参数量,并且能经过增长层数(加到数十层)提升性能,很是胜任图像识别的任务。数组

卷积神经网络

clipboard.png

一个普通的卷积神经网络由各类层按顺序堆叠而成,这些层主要分三类:卷积层、池化层和全链接层。有时激活函数也算一层,它逐元素进行激活函数操做。并且为了更好的理解如何组装这个网络,咱们先详细介绍这几种层的原理网络

卷积层

注:如下例子输入数据,输出数据,卷积核的截面都是正方形(宽度和高度相等)函数

clipboard.png

有一张 32x32 的图像,咱们保持输入图像数据的三维结构,则输入是一个 32x32x3 的三维数组。咱们有一个5x5x3的卷积核(kernel)/滤波器(filter),让这个卷积核在宽度和高度上滑过整个数据空间,在每一个位置,计算卷积核和数据的部分区域(二者重合的部分)的内积得到一个值,这个值加上偏置值b后通过激活函数做为输出的激活值。当卷积核完成这个操做后,会获得一个由激活值组成的二维的特征映射图(feature map,简称特征图)性能

如上图左,若是步长为1(每次移动一个像素),会获得一张 28x28x1 的特征图,有28x28个神经元。关于神经元:学习

  • 每一个神经元只与输入数据的局部区域链接,该局部区域称为该神经元的感觉野(receptive field)。感觉野的大小(宽高)也就是卷积核的大小(宽高),一般为正方形(宽高相等);而卷积核的深度是和输入数据的深度相等的。上图的感觉野大小是5x5。
  • 同一个特征图上的神经元都公用一套权重,也就是那个卷积核。这称为参数共享,是卷积层的特性,卷积层中的神经元经过参数共享(而不像普通网络中每一个神经元都有本身的一组参数)大大减低参数量。

在一个卷积层中,一般会有多个卷积核,每一个卷积核都生成一个特征图,将这些特征图在深度方向堆叠起来就获得输出数据,做为下一个卷积层的输入或进入池化层。编码


卷积核的理解:
卷积核就是卷积层的参数,是咱们要训练的参数。
笔者对卷积核一个直观的理解是,训练好的卷积核至关于特征提取器,他对整个图进行扫描,并在每一个位置留下激活值(至关于该位置拥有某特征的可能性),这些激活值组成的特征图就至关于某特征分布的几率图。一个卷积核对应一种特征,使用多个卷积核提取图像的多个特征后,能够喂给下一层卷积层让下一层的卷积核提取更深一层的特征(浅层特征间的关系与组合),直到最后能够获得输入图像各类类别的可能性。spa


下面回到卷积层,注意到在卷积层中,有几个超参数影响着输出数据的尺寸(至于参数设定,文章最后):.net

  1. 卷积核的大小(F):影响着输出数据的宽高
  2. 卷积核数量(K):影响着输出数据的深度,卷积核数量与输出数据的深度在数值上相等
  3. 步长(S):影响着输出数据的宽高,步长越大,输出数据的宽高越小
  4. 零填充(P):零填充指在输入数据的宽和高两个维度上用零填充指定宽度。如输入数据大小为32x32x3,填充为2,则输入数据大小变为34x34x3。零填充很重要,若是只进行卷积而不使用零填充,那么输出数据的尺寸会不断缩小,致使特征丢失

知道这些参数后,根据输入数据的尺寸W1 ✖ H1 ✖ D1,咱们有公式计算输出数据的尺寸W2 ✖ H2 ✖ D2对象

  • 宽:$W_2 = {(W_1-F+2P)\over S}+1$
  • 高:$H_2 = {(H_1-F+2P)\over S}+1$
  • 深度:$D_2=K$
  • 其中$(W_1-F+2P)$与$S$、$(H_1-F+2P)$与$S$必须是整除关系,不然意味着卷积核会超出输入数据的边界(步长为一确定没问题,大于一其余参数就要当心设置了)
  • 每一个卷积核有 F ✖ F ✖ D1个权重,K 个卷积核,卷积层共有F ✖ F ✖ D1 ✖ K 个权重和K 个偏置值

$$$$

卷积操做的矩阵实现

实际应用中,咱们不多像上图同样在高维数组中迭代点积,由于这样正向反向传播都很差作,咱们喜欢的仍是惯用的矩阵操做。好消息是这是可行的,卷积运算本质上就是在卷积核和输入数据的局部区域间作点积,利用这一点咱们能够把卷积操做转化为矩阵乘法:

  • 把每一个卷积核都展开成行向量(每一个深度切片都展开成一行,拼起来得到一大行)做为卷积核矩阵的一行,得到矩阵W
  • 把卷积操做的每一个点积区域展开成列向量(每一个深度切片都展开成一列,拼起来得到一大列)做为输入矩阵的一列,得到矩阵X
  • 这样卷积操做就至关于X*W这个矩阵乘法了,输出矩阵X*W的每一行对应某个卷积核得到的特征图的展开(输出数据每一个深度切片的展开)

这里只简单介绍实现,带图的详细说明请看此文章,很不错

池化层

在连续的卷积层之间会周期性地插入一个池化层,它的做用是逐渐下降数据体的空间尺寸(数据降采样),这样的话就能减小网络中参数的数量,使得计算资源耗费变少,也能有效控制过拟合。

clipboard.png

池化操做的对象是每个特征图,也就是输入数据的每一个深度切片。这里介绍经常使用的最大池化,对于每个切片,会有一个扫描空间在宽度和高度上滑过整个切片,在每一个位置选出空间内的最大值做为输出。如上图,输入4x4x4的数据,使用最大池化,空间大小2x2,步长为2,则输出2x2x4的数据。

根据输入数据的尺寸W1 ✖ H1 ✖ D1,空间大小F和步长S,咱们有公式计算输出数据的尺寸W2 ✖ H2 ✖ D2

  • 宽:$W_2 = {(W_1-F)\over S}+1$
  • 高:$H_2 = {(H_1-F)\over S}+1$
  • 深度:$D_2=D_1$
  • 池化层不多使用零填充

在实际使用中,最大池化一般采用$F=2,S=2$(无重叠,普通池化);较少用的有$F=3,S=2$(有重叠,重叠池化)


除了最大池化外,还有平均池化、随机池化、lp池化等,这里就不深刻了,交给读者自行了解。在图像识别这一块,一般经验性的使用最大池化(性能好,反向传播也容易)。


另:一些学者认为能够不使用池化层,转而使用较大步长的卷积层来代替池化层实现数据尺寸的下降。一些发现也认为在训练一个良好的生成模型(如变化自编码器,生成性对抗网络)时,弃用池化层也是很重要的。这样看来的话,将来的卷积网络可能会向无池化层的方向发展

全链接层

clipboard.png

卷积神经网络的最后一部分是全链接层组成的网络(也就是前面讲的普通的神经网络)。图像数据通过多层卷积层和池化层后,会获得足够小的特征数据,把特征数据的每一个切片展开成向量并拼成一个大向量,即可做为全链接层的输入,最后输出类别得分。

全链接层转化为卷积层

任何全链接层均可以被转化为卷积层。只要把卷积核的尺寸改为和输入数据尺寸一致就能实现全链接了。
clipboard.png

举个栗子,如上图,若是最后池化层输出数据大小为 4x4xD,咱们要将其接入一个K = 4096 (神经元个数)的全链接层,则须要4096个尺寸为4x4xD的卷积核,卷积后的到1x1x4096的输出就对应着那个全链接层中的4096个神经元的值。若是第二个全链接层K=1000,则另须要1000个尺寸为1x1x4096的卷积核,卷积后获得1x1x1000的输出对应着第二个全链接层中的1000个神经元,如此类推。


这种转化参数量是没有改变的,看似没有好处,可是在下面的状况,这种转化能使计算高效化
clipboard.png

如今有一张大尺寸图像,咱们有一个浮窗,让浮窗在宽和高上滑过整张图片,在每一个位置浮窗围住的子图像将做为卷积神经网络的输入,而后网络输出该子图像的评分数据。如今重点来了:

  • 若是这是个原版的卷积神经网络(带全链接层),由于网络中的全链接层上改变了原先数据的维度,致使一次只能输出某个子图像的评分数据(向量)。整个过程就须要迭代屡次网络才行
  • 若是这是个改版的卷积神经网络(全链接层改为卷积层),由于浮窗行为与卷积层的共性,加之没有全链接层,数据会维持三维结构;只需一次正向传播便能获得全部评分数据
  • 相比之下,改版的卷积神经网络更高效,它在每一个子图像的计算中共享了计算资源。

另:这种带浮窗的设定,就是目标检测的实现方法,一般在一个大图像上,在不一样的位置会有不一样类别的物体,浮窗在每一个位置都进行一次识别,就能在一张图中分辨出多个物体,所谓目标检测。

组装卷积神经网络

介绍完各类层的原理后,最后介绍如何用这些层组成一个完整的卷积神经网络,并解析各层参数的选用

一般卷积层有如下结构:
输入→→[ [卷积层→→激活函数层]*N →→池化层 ]*M →→[全链接层→→激活函数层]*K→→全链接层→→输出
池化层是能够不用的,全链接层能够转化为卷积层。*K、*N、*M 指重复若干次,其中N >=0,一般N<=3;M>=0;K>=0,一般K<3。N越大意味着池化前有更多的卷积层,这个思路适用于更大更深的网络,由于在执行具备破坏性的池化操做前,多重的卷积层能够从输入数据中学习到更多的复杂特征。

各层参数设定

输入层:图像的尺寸应该能被2整除屡次,如32,64,96,224等。以方便池化操做


卷积层:

  • 卷积核数量应该为2n ,如64,128,512......
  • 卷积核尺寸推荐选较小的(如3x3,5x5),对应步长使用1。更大的卷积核尺寸(如7x7),一般只用在第一个面对原始图像的卷积层上
  • 使用零填充,若是步长为1,填充大小 $P =(F-1)/2$ 便能维持输入输出的宽高一致

池化层:

  • 一般使用最大池化,并使用2x2空间,步长为2($F=2,S=2$)
  • 较少用的有3x3空间,步长为2,重叠池化($F=3,S=2$)
  • 更大的空间极少用,池化效果太强,容易致使特征丢失

全链接层:就很少说了,就是普通的mlp


本文完:介绍了普通卷积神经网络的结构。在实际使用上,卷积神经网络因其不一样的结构又细分红不一样网络(如AlexNet,VGGNet,ResNet等),它们都是卷积神经网络的一种,这些之后再深刻

相关文章
相关标签/搜索