一文读懂卷积神经网络的基础架构

引子:生物视觉机制与计算机视觉

如何让机器学会观察这个世界呢?生物的视觉认知过程给了我们诸多启示:这源于1981年获得了诺贝尔生物学和医学奖的一项研究:视觉系统的信息加工机制,这种机制使得生物通过多层视细胞和视神经对视觉刺激进行逐层处理、从而理解复杂的视觉特征并形成高层语义认知。这项于1962年提出的研究也启发了Yann LeCun,1989年,他首次提出了卷积神经网络。

时至今日,卷积神经网络作为计算机中最基本、最重要的模型,已经走过了30多年时间。1998年LeNet5提出之后,神经网络的发展一度陷入低潮。但在2012年ILSVRC(ImageNet Large Scale Visual Recognition Challenge)上一举夺魁的AlexNet又使得深度学习和人工智能有了爆发式的发展,2012年也被成为现代意义上的深度学习元年。

一、基础架构

说到卷积神经网络,就不得不提LeNet(图1),它是最早发布的卷积神经网络之一,这个模型最初是由AT&T贝尔实验室的研究院Yann LeCun于1989年提出的,目的是识别图像中的手写数字,并且它通过反向传播成功训练了卷积神经网络。当时LeNet的效果和支持向量机相媲美,成为了监督学习的主流方法。被广泛应用于自动取款机中,帮助识别支票上的数字。

LeNet-5
图1:LeNet基础网络架构

 麻雀虽小,五脏俱全,LeNet揭示了最为基础的卷积神经网络架构。这这些架构如下面的逻辑图(图2)所示:一个深度卷积神经网络通常由若干卷积层叠加若干全连接层组成,中间也包含各种非线性操作以及池化操作。和普通深度前馈网络相同,卷积神经网络也可使用前向传播算法进行训练,相较于其它网络模型,卷积操作的参数共享特性使得需要优化的参数数目大大缩减,提高了模型的训练效率和可扩展性。它主要用于处理类网络结构的数据,因此对于时间序列以及图像数据的分析与识别具有显著优势。

图2:卷积神经网络的基础架构

1.1 卷积层

要理解卷积层的概念,我们首先要明白什么是卷积?我在本科时的信号处理课上就学习过有关卷积的相关知识,当时看数学公式看花了眼,但仍然没有理解卷积的本质,而从此明白了卷积神经网络(CNN) 这篇公众号文章,以简明易懂的语言向我们阐述了什么叫做卷积,这里也是参考这篇文章,结合我自己的理解,向大家复述卷积的概念。

1.1.1 卷积的形象解释

对于左边的图像,若想要进行边界检测,我们可以设计一个中间图像所示的滤波器,往图片上“盖”,对应元素相乘求和。计算一个区域之后,就往其他区域移动,接着计算,直到把原图片每一个角落都覆盖了为止,这个过程就叫做“卷积”。

1.1.2 步长(stride)

这里所说的“移动”,就是步长(stride),在卷积神经网络中,它具体指的是卷积核在特征图上滑动的步长。在本例中假设步长是1,那么覆盖衣蛾地方之后就挪一格,容易知道总共可以覆盖6*6个不同的区域。如果stride=2,那么输出的就是一个3*3的矩阵。

1.1.3 卷积层的作用

如何设计滤波器呢?对于上述边界检测的例子,滤波器的设计显而易见,也成功地检测出了边界,理论上只要我们经过精细的设计,就总是能设计出合适的filter。但是对于千变万化的图片,人类不好自己设计特征,毕竟对于复杂的图片,特征的数量是千变万化的——实际上,我们无需手动设计滤波器的参数,而是让机器自己去“学习”这些参数。

 具体来说,卷积层是通过特定数目的卷积核(又称滤波器)对输入的多通道(channel)特征图进行扫描和运算,从而得到多个拥有更高层语义信息的输出特征图(通道数目等于卷积核个数),识别图像的局部特征到总体特征。

1.1.4 padding填充方法

从上面的实例中,我们可以知道,原图像在经过filter卷积之后,变小了,从(8,8)变成了(6,6)。假设我们再卷一次,那大小就变成了(4,4)了。可是如果继续这样做下去的话,会存在什么问题?

  • 每次卷积,图像都缩小,这样卷不了几次就没了;
  • 相比于图片中间的点,图片边缘的点在卷积中被计算的次数很少。这样的话,边缘的信息就易于丢失。

为了解决这个问题,我们可以采用padding的方法。我们每次卷积前,先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。

图片

比如,我们把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,就是(8,8),没有变。我们把上面这种“让卷积之后的大小不变”的padding方式,称为 “Same”方式,把不经过任何填白的,称为 “Valid”方式。这个是我们在使用一些框架的时候,需要设置的超参数。

1.1.5 特征图的通道数

如果输入图像是三维的,那么就会增多一个channels,这个时候,filter的维度就要变成(3,3,3)了,它的 最后一维要跟输入的channel维度一致。下图中的输入图像是(8,8,3),filter有4个,大小均为(3,3,3),得到的输出为(6,6,4)。

图片

1.1.6 卷积层在PyTorch中的参数 

PyTorch使用卷积非常简单,调用卷积层的代码如下所示:

from torch import nn
conv = nn.Conv2d(in_channels=1,out_channels=1,kernel_size=3,stride=1,padding=1,dilation=1,groups=1,bias=True)

 可使用conv查看卷积核的基本信息,显示信息如下所示:

Conv2d(1, 1, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))

1.1.7 感受野

感受野(Receptive Field)是指特征图上的某个点能看到的输入图像的区域,即特征图像上的点是由输入图像中感受野大小区域计算得到的。

如下图所示,这是一个三层卷积神经网络,每一层的卷积核为3*3,步长为1,那么可以看到第2层对应的感受野为3*3,第三层对应的感受野为5*5.

Receptive Field in Deep Convolutional Networks | by Reza Kalantar | Medium

 尤其在物体检测算法中,理解感受野是理解卷积神经网络的基础,在使用Anchor作为强先验区域的物体检测算法,如Faster RCNN和SSD,如何设置Anchor的大小,Anchor应该对应在特征图的哪一层,都应当考虑感受野。通常来讲,Anchor的大小应当与感受野相匹配,尤其是有效的感受野,过大或过小都不好。

在卷积神经网络中,有时还需要计算特征图的大小,一般可以按照下式进行计算:

n_{out}=\frac{n_{in}+2p+k}{s}+1

 其中n_in和n_out分别为输入特征图与输出特征图的尺寸,p代表这一层的padding大小,k代表这一层的卷积核大小,s为步长。

 1.1.8 空洞卷积、转置卷积和可变形卷积

此部分后续再补

1.2 池化层(汇聚层)

卷积层虽然可以显著减少网络中连接的数量,但特征映射组中的神经元个数并没有显著减少。如果后面继续接一个分类器,分类器的输入维数依然很高,很容易出现过拟合,为了解决过拟合,可在卷积层之后加一个汇聚层,从而降低特征维数,避免过拟合。

Illustration of Max Pooling and Average Pooling Figure 2 above shows an...  | Download Scientific DiagramIllustration of Max Pooling and Average Pooling Figure 2 above shows an...  | Download Scientific Diagram

常见的pooling方法有Maxpooling和Averagepooling两种方法,如上图所示,这时我们需要指定的超参数有窗口大小和步长,一般取大小为(2,2),步长为2的filter,这样经过pooling之后,输入的长宽都会缩小2倍,channels不变。Pytorch代码如下所示:

from torch import nn
max_pooling = nn.Maxpool2d(2,stride=2)
aver_pooling = nn.Avgpool2d(2,stride=2)

1.3 全连接层(Fully Connected)

 如下图所示,前连接层就是我们之前学的神经网络中最普通的层,由于每层的每一个单元都和前一层的每一个单元连接,所以被称之为“全连接”。全连接层的特点是每一个结点都与上下层的所有节点相恋,输入与输出都被延展成一维向量,因此从参数量来看全连接层的参数量是最多的。

 在物体检测和分类算法中,卷积层的主要作用是从局部到整体地提取图像的特征,而全连接层则用来将卷积抽象出的特征图进一步映射到特定维度的标签控件,以求取损失或者输出预测结果。

图片

这里需要说明的是,在经过数次卷积和池化之后,我们 最后会先将多维的数据进行“扁平化”,也就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了

可以从图中看到,随着网络的深入,我们的图像(严格来说中间的那些不能叫图像了,但是为了方便,还是这样说吧)越来越小,但是channels却越来越大了。在图中的表示就是长方体面对我们的面积越来越小,但是长度却越来越长了。

PyTorch指定全连接层需要指定输入与输出的维度:

from torch import nn
#第一维表示一共有4个样本
input = torch.randn(4,1024)
linear = nn.Linear(1024,4096)
output = linear(input)

 输入的shape为【4,1024】,输出的shape为【4,4096】。

1.4 激活函数

神经网络如果仅仅是由线性的卷积&全连接运算堆叠而成,则其无法形成复杂的表达空间,也就很难提取出高语义的信息,因此还需要加入非线性的映射,又称为激活函数,可以逼近任意的非线性函数,以提升整个神经网络的表达能力。常用的激活函数有Sigmoid、ReLu及Softmax函数。

关于sigmoid函数的具体介绍及优缺点,请参考下面链接中的文章,本文不再赘述:常用的激活函数合集(详细版)_小wu学cv的博客-CSDN博客

深度学习领域最常用的10个激活函数,一文详解数学原理及优缺点

1.5 批量归一化(Batch Normalization) 

二、卷积神经网络V.S.传统神经网络的特性

卷积神经网络,无非就是把传统神经网络多层叠加的全连接层换成了卷积层和池化层,将传统的一个个神经元组成的layer变成了filters组成的layer。那么卷积神经网络相对于传统神经网络,有何好处?主要有两个优点或特性:稀疏交互和权值共享。

2.1 稀疏交互

由卷积的操作可知,输出图像中的任何一个单元,只跟输入图像的一部分有关系。在卷积神经网络中,卷积核的尺度远小于输入的维度,这样每个输出的神经元仅与前一层特定局部区域内的神经元存在连接权重(即产生交互),我们称这种特性为稀疏交互。

图片

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

2.2 权值共享

在传统神经网络中,假设我们的图像是8×8大小,也就是64个像素,假设我们用一个有9个单元的全连接层:那么我们就需要 64×9 = 576个参数(先不考虑偏置项b)。因为每一个连接都需要一个权重w。

图片

 那我们看看同样有9个单元的filter是怎么样的:

图片

有几个单元就几个参数,所以总共就9个参数!对于不同的区域,我们都共享同一个filter,因此就共享这同一组参数。由于一个特征一般情况下很可能在不止一个地方出现,比如“竖直边界”,就可能在一幅图中多出出现,那么 共享同一个filter不仅是合理的,而且是应该这么做的。

由此可见,参数共享机制,让我们的网络的参数数量大大地减少。这样,我们可以用较少的参数,训练出更加好的模型,典型的事半功倍,而且可以有效地避免过拟合。同样,由于filter的参数共享,即使图片进行了一定的平移操作,我们照样可以识别出特征,这叫做 “平移不变性”。因此,模型就更加稳健了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值