【零基础深度学习第六课:卷积神经网络实例分析】

一、经典卷积网络

1.1 LeNet-5 网络

LeNet-5网络是最古老的卷积网络(1998年提出),该网络一般负责识别灰度图像。假设现在需要识别一张标有数字“7”的32×32×1的灰度图片,下面是使用LeNet-5网络构建分类模型的整个过程(与上一章所介绍的卷积网络十分相似):

  • 第一步:使用6个5×5的过滤器对32×32×1的灰度图像进行卷积,步长s=1、padding=0(LeNet-5网络中padding都为0),输出矩阵为28×28×6。

在这里插入图片描述

  • 第二步:使用(f=2)过滤器进行池化操作,池化步长 s=2(注:在1998年该网络被提出时,平均池化还是主流,所以这里用的平均池化),输出矩阵为14×14×6(长和宽都被缩小了一半)。

在这里插入图片描述

  • 将上面两步进行的过程再执行一遍。
    在这里插入图片描述

  • 第四步:将这个5×5×16的三维矩阵展成400×1的一维矩阵,将其与全连接层进行连接(共有两个全连接层,单元数分别为120、84)
    在这里插入图片描述

  • 第五步:将这84个特征输入进softmax回归单元,得到预测值y(输出的预测值y为0-9十个数字)。
    在这里插入图片描述
    由上述过程可知:随着网络层数的深入,图片的长和宽在逐渐减小,深度在逐渐增大。该神经网络的一种构造模式至今仍然在使用:就是一个或者多个卷积层后面跟一个池化层,然后又是若干个卷积层在跟一个池化层,最后是两个全连接层得到输出。而且在LeNet-5网络中过滤器的深度与输入图片的深度是必须匹配的,这是由于在1998年时,计算机的运算速度还很慢,为了避免引入过多的参数才采取这个办法。

1.2 AlexNet 网络

该网络是由论文第一作者Alex的名字命名的,下面介绍具体过程。
(1)第一步:使用96个11×11的过滤器对一张227×227×3的输入图片进行卷积,步长s=4、padding=0,输出矩阵为55×55×96。

在这里插入图片描述
(2)第二步:使用大小为3的过滤器(f=3)进行最大池化操作,池化步长s=2,输出矩阵为27×27×96。

在这里插入图片描述
(3)第三步:使用256个5×5的过滤器继续进行卷积,步长s=4、padding=0,输出矩阵为27×27×256。再对这个输出矩阵进行最大池化(因为池化的f、s一旦设定是不会变的,使用这里就不写出来了),得到13×13×256的输出矩阵。

在这里插入图片描述
(4)第四步:再进行两层“卷积+池化”操作(具体参数见下面示意图),最终得到一个6×6×256的输出矩阵

在这里插入图片描述
(5)第五步:将这个6×6×256的矩阵展开成9216×1的一维矩阵,与两个全连接层相连接,最后使用sotfmax回归单元输出y^。

在这里插入图片描述
由上述过程可知,AlexNet网络与LeNet-5网络很相似,不过AlexNet网络要大得多,所含参数也要多得多。AlexNet网络比LeNet-5网络性能更好的一个原因是AlexNet网络使用了ReLU函数作为激活函数(LeNet-5网络使用的激活函数是sigmoid或tanh)。

1.3 VGG-16网络

研究发现,适当增加网络的深度可以提高网络的性能,那么其实可以在AlexNet网络的基础上,通过增加其深度实现性能的优化,这其实就是VGG网络的思想,下面通过一个例子来介绍VGG网络的构造过程。
(1)第一步:用64个3×3的过滤器对一张224×224×3的图片进行两次相同的卷积操作,得到224×224×64的输出图片。

在这里插入图片描述
(2)第二步:接下来利用池化层将224×224×64的图片压缩至112×112×64的图片。

在这里插入图片描述
(3)第三步:再用128个3×3的过滤器进行两次卷积和一次池化,得到输出56×56×128。

在这里插入图片描述

(4)第四步:再进行三次卷积和一次池化、三次卷积和一次池化、三次卷积和一次池化…最后得到7×7×512的输出矩阵。

![在这里插入图片描述](https://img-blog.csdnimg.cn/66ee9755d8d941048976d402fccdd990.png在这里插入图片描述

(5)第五步:连接两层含有4096个单元的全连接层,最后使用softmax分类器得到y^。

在这里插入图片描述
至此,整个VGG-16网络构造过程结束,其实VGG-16中的16是指该网络中含有16个卷积层和全连接层。虽然该网络总共包含1.38亿个参数,但是这个网络的结构并不复杂(都是几个卷积层后面跟一个池化层),可以发现随着网络深度的加深,卷积层中使用的过滤器数量呈倍增长(这也是该网络的一大特点)。

二、1 × 1 卷积

图像空域内具有局部相关性,过滤器的作用在于特征的抽取,越是大的过滤器尺寸就意味着越大的感受野,当然随之而来的是更多的参数, 但是在卷积神经网络的中常常会看到一种1×1卷积。

2.1 对二维图像进行1×1卷积

如下图,使用一个1×1的过滤器对一张二维图像进行卷积:
在这里插入图片描述
我们发现,使用1×1卷积相当于只是对这张图片进行了灰度值翻倍的操作。其实1×1卷积对于二维图像的卷积可以说毫无意义。

2.2 对三维图像进行1×1卷积

假设现在要对一个28×28×192的三维图像进行卷积,我们可以通过池化层对图像的长和宽进行压缩,但是如果图像的深度很大,我们希望压缩的话,却无法通过池化实现。
使用1×1卷积的作用一般是升/降图片的维度(这里的维度指的是图片深度)。比如上述的28×28×192的三维图像,现在需要将其降维成28×28×32,即192个通道变成32个通道,只需要使用32个1×1×192的过滤器即可实现,如下图:

在这里插入图片描述
通过一次卷积操作,将28×28×192的图像变为28×28×1。这样的话,使用32个1×1×192的过滤器,就可以卷积出32张28×28×1的图像,再通过将这32张图像进行叠加,就实现了将28×28×192的图像变为28×28×32。

2.3 1×1卷积的作用

综上,使用1×1的过滤器的作用在于:增加或降低图片的深度。
应用案例:ResNet中的1*1卷积和Inception网络中的1×1卷积,使用1×1的过滤器的最终目的都在于通过改变图片深度,起到减少计算成本的作用。
注:这两个1×1卷积的案例在后面两节中会详细介绍。

三、ResNet(残差网络)

3.1 网络退化

我们都知道增加网络的深度可以提高网络的性能。比如一个深的网络A和一个浅的网络B,那A的性能至少能跟B一样,为什么呢?因为就算把B的网络参数全部迁移到A的前面几层,而A后面的层只是做一个等价映射(即f(x)=x),也可以达到跟B网络一样的效果。例如VGG网络就是在AlexNex的基础上,通过增加网络深度大幅度提高了网络性能。但是在深度学习中,网络层数增多一般会伴着下面三个问题:计算资源的消耗、模型容易过拟合、梯度消失/梯度爆炸。
问题1可以通过GPU集群来解决;问题2可通过采集海量数据,并配合Dropout正则化等方法也可以避免;问题3通过Batch Normalization也可以避免。貌似只要无脑的增加网络的层数,我们就能从此获益,但事实并非如此。
研究发现,对于一个普通网络(Plain network)随着网络层数的增加,网络发生了退化现象:随着网络层数的增多,训练集error逐渐下降,然后趋于饱和,当继续增加网络深度时,训练集error反而会增大(注意这并不是过拟合,因为在过拟合中训练error是一直减小的)。而理论上随着网络层数的增大,训练效果应该越来越好才对。
在这里插入图片描述
图中蓝线为真实情况,绿线为理论情况。当发生网络退化时,深层网络的效果甚至不如浅层网络,那么如何避免网络退化呢?

3.2 残差网络(ResNet)

(1)残差块与残差网络
下面通过一个例子引入残差网络的概念:
在这里插入图片描述
如图为一个神经网络中的一部分:a[l]首先进行线性激活(z[l+1]=w[l+1]a[l]+b[l+1])得到z[l+1],然后通过ReLU函数的非线性激活(a[l+1]=g(z[l+1]))得到a[l+1];接着再进行线性激活(z[l+2]=w[l+2]a[l+1]+b[l+2])得到z[l+2],然后通过ReLU函数的非线性激活(a[l+2]=g(z[l+2]))得到a[l+2]。将上述过程反映到下图:

在这里插入图片描述
由此可知,a[l]要得到a[l+2]需要经过以上所有步骤(即主路径main path)。而所谓残差网络,就是将a[l]直接映射(Identity Mapping到第二层网络中的ReLU激活函数中(意味着Plain Net中原本的a[l+2] = g(z[l+2]) 变成了ResNet中的:a[l+2] = g(z[l+2]+a[l])),即a[l]的信息直接到达神经网络的深层,不再沿着主路径传递。这条捷径称为short cut(有时也可称为skip connection):

在这里插入图片描述
将上述过程反映到示例网络中如下图所示:
在这里插入图片描述
a[l]由short cut直接传递到第二层网络单元这个部分称为残差块,由多个残差块构成的网络就是残差网络,研究发现使用残差网络能够避免“网络退化”问题。注意:a[l]插入的时机是在线性激活之后,非线性激活之前!
注:a[l+2] = g(z[l+2]+a[l])中“z[l+2]+a[l]”这个部分其实为直接映射部分和残差部分相加,其中a[l]为直接映射部分,z[l+2]为残差部分。残差块一个更通用的表示方式是:
在这里插入图片描述
其中h(xl)为直接映射部分,F(xl ,Wl)为残差部分,f()为激活函数。
(2)普通网络转化为残差网络的过程
下图为将一个普通网络(Plain network)转化成残差网络(RseNet)的例子:
在这里插入图片描述

在没两层之间添加short cut,构成残差网络(下图为五个残差块连接在一起的网络):

在这里插入图片描述
由上面这个例子可知,将普通的卷积神经网络搭建为残差的卷积神经网络的过程大致如下(以VGG网络为例):
1)使用VGG公式搭建Plain VGG网络
2)在Plain VGG的卷积网络之间插入直接映射。

四、Inception网络

4.1 Inception 网络简介

在Inception网络出现之前,大部分流行的CNN都是通过堆叠更多的卷积层,来使得网络深度更深,以此得到更好的性能(例如AlexNet、VGG-Net),而这些网络最大的问题就在于巨大的参数数量,例如VGG-19 基本上是参数量最多的卷积网络架构。
于是GoogL提出了Inception网络(又名GoogLeNet),,它的目的是设计一种具有优良局部拓扑结构的网络,即对输入图像并行地执行多个卷积运算或池化操作,并将所有输出结果拼接为一个非常深的特征图。因为 1×1、3×3 或 5×5 等不同的卷积运算与池化操作可以获得输入图像的不同信息,并行处理这些运算并结合所有结果将获得更好的图像表征。
如今常见的Inception 网络版本有:Inception v1、Inception v2和Inception v3、Inception v4和Inception-ResNet。每个版本都是前一个版本的迭代进化,本节将介绍Inception v1。

4.2 Inception 模块

4.2.1 问题提出

下图是三张狗的图片,希望使用卷积网络进行识别:
在这里插入图片描述
可以发现,从左到右狗占图像的比例在逐渐缩小,所以由于信息位置的巨大差异,为卷积操作选择合适的卷积核大小就比较困难(信息分布更全局性的图像适合较大的卷积核,信息分布比较局部的图像适合较小的卷积核)。而且过于深的网络更容易过拟合,将梯度更新传输到整个网络是很困难的,简单地堆叠较大的卷积层非常消耗计算资源。

4.2.2 解决方案

在同一层级上并行叠加具备多个尺寸的过滤器和池化器。这样一来网络会变得更宽,而不是更深(这也就是Inception模块思想)。举个例子,下图是一张28×28×192的三维图片,首先使用64个1×1的过滤器对图像进行卷积,会输出一个28×28×64的输出矩阵,此时在这一层并行使用128个3×3的过滤器对图像进行卷积,又会得到一个28×28×128的输出矩阵,此时将两个输出矩阵进行拼接:
在这里插入图片描述
注:为什么使用 3×3 的过滤器得到的输出仍然是 28×28 ?这是因为为了使 3×3 过滤器得到的输出矩阵能与 1×1 得到的输出矩阵能拼接(长和宽相同),所以在使用 3×3 卷积时加入了 padding,这种方式一般称为“相同卷积”(所谓相同是针对于 1×1 过滤器来说的)。
同理,可以按照上述思路继续在该层添加5×5的过滤器,得到28×28×32的输出;再添加一个最大池化层得到28×28×32的输出(这里使用最大池化后输出矩阵的长和宽不变,其原因还是使用了padding),现在将所有输出矩阵进行拼接:
在这里插入图片描述
以上就是构建一个Inception模块的过程。有了这样一个Inception模块,你在输入某个矩阵后无需确定使用多大的过滤器,或是否需要池化,而是由Inception网络自行通过学习确定这些参数。但是上述的这个Inception模块会有一个问题,那就是会产生相当大的计算成本,那么如何解决这个问题呢?

4.3 计算成本分析与改进

4.3.1 计算成本分析

现针对上一节Inception模块中的5×5过滤器的计算成本,进行如下分析。
在这里插入图片描述
这次卷积过程中有32个5×5×192的过滤器,输出矩阵为28×28×32,意味着要计算28×28×32个数字,而每一个数字都要计算5×5×192遍,所以乘法运算总次数为5×5×192×28×28×32,结果等于1.2亿次,可见这个计算成本相当高。
注:在分析计算成本时,只算了乘而没有算加(将每个过滤器卷积后的矩阵进行叠加),因为相较于乘,加的成本忽略不计。

4.3.2 改进方法:添加“瓶颈层”

现使用16个1×1过滤器进行卷积,将矩阵深度进行压缩,再使用5×5的过滤器进行卷积:
在这里插入图片描述
可以发现,通过这种方式进行卷积得到的输出矩阵与只使用5×5过滤器得到的输出矩阵维度相同。在此方法中,我们加入了一个1*1卷积的中间层,将矩阵深度进行压缩,这一层又被称为“瓶颈层”,“瓶颈层”的作用在于通过压缩输入矩阵的深度从而减少5×5卷积的计算量
接下来分析一下计算成本:首先使用16个1×1×192的过滤器,对28×28×16这个矩阵进行运算,相当于做了28×28×16×192=240万次运算;再使用32个5×5×16的过滤器,对28×28×32进行计算,计算次数为28×28×32×5×5×16=1000万。所以总成本为1240万,与之前的1.2亿相比减少了很多。

4.4 Inception网络

将许多Inception模块拼接在一起就可以得到一个Inception网络。

4.4.1 构建Inception模块

假设现在构建一个Inception模块:先使用一个5*5的卷积(含瓶颈层),得到一个28×28×32的输出;再使用一个3×3的卷积(含瓶颈层),得到一个28×28×128的输出;再使用一个1×1的卷积(无需瓶颈层),得到一个28×28×64的输出;最后使用一个3×3的最大池化,得到一个28×28×192的输出,可以发现使用最大池化后输出与输入的深度一样,所以还需要使用一个1×1的卷积来压缩一下深度。最后将所有的输出拼接起来,得到一个28×28×(64+128+32+32)的输出矩阵:
在这里插入图片描述

4.4.2 构建Inception网络

现将多个Inception模块拼接在一起构成Inception网络:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值