(4-2)卷积神经网络 | 深度卷积网络-实例探究

目录

经典网络

LeNet-5

AlexNet

VGG - 16

残差网络

残差块(Residual block)

残差网络(ResNets)

残差网络原理

Inception网络

1x1卷积

Inception模块主要思想

Inception网络结构

网络架构使用的建议

使用开源的实现方案

迁移学习

数据增强


经典网络

LeNet-5

LeNet-5相比现代版本,这里得到的神经网络会小一些,只有约 6 万个参数。而现在,我们经常看到含有一千万到一亿个参数的神经网络,比这大 1000 倍的神经网络也不在少数。

可以发现,LeNet-5网络结构随着网络层次的加深,图像的高度和宽度在缩小,与此同时,通道数量一直在增加。

在这个网络结构中,一个或多个卷积层后面跟着一个池化层,然后又是若干个卷积层再接一个池化层,然后是全连接层,最后是输出,种模式至今仍然经常用到。

AlexNet

如图所示,AlexNet结构模型是将图片先进行一次Valid卷积,之后再进行3次same卷积操作,然后进行三次全连接,最后使用 softmax 函数输出识别的结果。

AlexNet 与 LeNet-5 有很多相似之处,不过 AlexNet 要大得多, LeNet-5 大约有 6 万个参数,而 AlexNet 包含约 6000 万个参数。当用于训练图像和数据集时,AlexNet 能够处理非常相似的基本构造模块,这些模块往往包含着大量的隐藏单元或数据;AlexNet 使用了 ReLu 激活函数,这也是它比 LeNet 表现得更出色的另一个原因。

VGG - 16

VGG卷积层和池化层均用相同的卷积核大小,VGG-16 中的 16指的是网络中包含 16 个卷积层和全连接层,总共包含约 1.38 亿个参数,这确实是个很大的网络,需要训练的特征数量非常巨大。但 VGG-16 的结构并不复杂,且网络结构很规整,都是几个卷积层后面跟着可以压缩图像大小的池化层,通过池化层来缩小图像的高度和宽度。另外,卷积层的过滤器数量变化存在一定的规律,随着网络的加深,图像的高度和宽度都在以一定的规律不断缩小,每次池化后刚好缩小一半,而通道数量在不断增加,而且刚好也是在每组卷积操作后增加一倍,这种相对一致的网络结构对研究者很有吸引力。

残差网络

由于存在梯度消失和梯度爆炸问题,对于非常非常深的神经网络是很难训练的。跳跃连接可以从某一网络层获取激活值,然后迅速反馈给另外一层,甚至是神经网络的更深层,我们可以利用跳跃连接构建能够训练深度网络的ResNets。

残差块(Residual block)

ResNet块则将前向传播过程增加了一个从 a^{[l]} 直接到 z^{[l+2]} 的连接,将其称之为“short cut”或者“skip connection”。也就是说,前向传播公式的最后一个步骤变为:𝑎[𝑙+2] = 𝑔(𝑧[𝑙+2] + 𝑎[𝑙]),也就是加上的这个𝑎[𝑙]产生了一个残差块。

残差网络(ResNets)

多个残差块堆积起来构成残差网络,也就是在普通网络的基础上加上跳跃连接,其结构如下: 

如果我们用标准优化算法训练一个普通网络,如梯度下降,如果没有跳跃连接,我们会发现随着网络深度的加深, 训练误差会先减少,然后增加。也就是说,对于一个普通网络来说,随着网络深度的加深,优化算法就越难训练,训练误差会越来越大。但从理论上来说,随着网络深度的加深,应该是训练误差越小。

在有残差的ResNet中,即使网络再深,训练误差都会随着网络层数的加深而逐渐减小。残差网络中间的激活有助于达到更深的网络,解决梯度消失和梯度爆炸的问题。事实证明ResNet 确实在训练深度网络方面非常有效。

残差网络原理

假设有个比较大的神经网络,输入为x,输出为 a^{[l]} ,并且我们在整个网络中均使用 ReLU 激活函数,所以激活值都大于等于 0。如果我们增加一个残差块来增加这个网络的深度:

从上节的内容可知,𝑎[𝑙+2] = 𝑔(𝑧[𝑙+2] + 𝑎[𝑙]),展开可以得到𝑎[𝑙+2] = 𝑔(𝑊[𝑙+2]𝑎[𝑙+1] + 𝑏[𝑙+2] + 𝑎[𝑙]),如果使用L2正则化或者权重衰减,会压缩W和b的值。为分便分析,我们假设𝑊[𝑙+2] = 0,𝑏[𝑙+2] = 0,则𝑎[𝑙+2] = 𝑔(𝑎[𝑙]) = 𝑎[𝑙]。从结果可以看出,对于残差块来学习上面这个恒等函数是很容易的。 也就是说,即使给神经网络增加了这两层,它的效率也并不逊色于更简单的神经网络。如果与此同时,增加的网络结构能够学习到一些有用的信息,那么就可以提升网络的性能。

简而言之,由于残差块学习恒等函数非常容易,能确定网络性能不会受到影响,很多时候甚至可以提高效率,因此 残差网络可以提升网络性能。

另外,由于𝑎[𝑙+2] = 𝑔(𝑧[𝑙+2] + 𝑎[𝑙]),ResNet在设计中使用了很多same卷积,以保留维度,很容易得到这个捷径连接,并输出这两个相同维度的向量。

Inception网络

1x1卷积

对于二维图片n x n x 1进行1x1的卷积,实际上相当于将矩阵与一个数字相乘,作用并不大。但是如果将三维图片与1\times 1\times n_{c} 卷积核进行卷积,如下图所示,1×1 卷积所实现的功能是遍历这 36 个单元格,计算左图中 32 个数字和过滤器中 32 个数字的元素积之和,然后应用 ReLU 非线性函数。因此,从根本上来说, 1×1 卷积核相当于对一个切片上的 n_{c} 个单元都应用了一个全连接的神经网络。最终三维的图形应用1 x 1的卷积核得到一个相同长宽但第三维度变为卷积核个数的图片。

  • 1 x 1卷积应用

从之前的内容中可以知道利用池化层可以压缩高度和宽度,但如果通道数很大,该如何压缩呢?如图所示,假设输入层为28×28×192的图片,我们可以用 32 个大小为 1×1×192  的过滤器,如果我们使用了 32 个过滤器,则输出层为 28×28×32。所以说,通过1×1卷积核我们可以压缩图片的通道数(𝑛𝑐 )。

另外,1×1 卷积层也可以保持输入层中的通道数量不变,当然也可以增加通道数量,它只是给神经网络添加了一个非线性函数。

Inception模块主要思想

  • 由网络自行决定参数

在构建卷积层时,我们需要决定过滤器的大小以及是否添加添加池化层,但是在 Inception 网络中,它会代替我们做决定,虽然网络架构因此变得更加复杂,但网络表现却非常好。如下图所示,Inception 模块的输入为 28×28×192,在保持输入图片大小不变的情况下,通过使用不同大小的过滤器以及带padding的池化操作,将不同运算结果的进行叠加,输出为 28×28×256。

 Inception 网络不需要人为决定过滤器的大小或者是否池化,而是由网络自行确定这些参数,我们可以给网络添加这些参数的所有可能值,然后把这些输出连接起来, 让网络自己学习它需要什么样的参数,采用哪些过滤器组合。

  • 通过1×1卷积降低计算成本

对于上图中5×5 的过滤器来说,输出大小为 28×28×32,而每个输出数字都需要执行 5×5×192 (卷积核大小) 次乘法运算,所以乘法运算的总次数为 5×5×192× 28×28×32≈ 1.2 亿。而用计算机执行 1.2 亿次乘法运算,成本是相当高的。

这里还有另一种架构,如下图所示:先使用 1×1 卷积把输入值从 192 个通道减少到 16 个通道,然后再使用 5×5 卷积得到最终输出(始终保持维度相同)。也就是说先缩小网络,然后再扩大,而瓶颈层就是网络中最小的部分。这样的计算成本为:192×28×28×16+5×5×16×28×28×32≈1240万。

因此,通过使用 1×1 卷积核作为瓶颈层进行过渡,能够有效减小计算成本。事实证明,只要合理地设置瓶颈层,既可以显著减小上层的规模,又不会影响网络性能,还能降低计算成本。

Inception网络结构

将上面介绍的两种主要思想结合到一起构成一个 Inception 模块:

将多个Inception 模块的堆叠构成Inception Network,以GoogleNet结构为例:

事实上,Inception网络中还有一些分支,这些分支有什么用呢?在网络的最后几层,通常称为全连接层,在它之后是一 个 softmax 层来做出预测,而这些分支就是通过隐藏层来做出预测,所以这其实是一个 softmax 输出。 Inception 网络中的分支确保了即便是隐藏单元和中间层也参与了特征计算,它们也能预测图片的分类。它在 Inception 网络中,起到一种调整的效果,并且能防止网络发生过拟合。

网络架构使用的建议

使用开源的实现方案

有很多深度学习的研究者都习惯把自己的成果作为开发资源,放在像 GitHub 之类的网站上。如果我们看到一篇研究论文想应用它的成果,我们可以考虑在网络上寻找一个开源的实现,这样通常要比你从头开始实现要快得多。

通常我们在开发一个计算机视觉应用时,会先选择一个我们喜欢的架构,接着寻找一个开源实现,从 GitHub中 下载下来,以此为基础开始构建。这样做的优点在于,这些网络通常都需要很长的时间来训练,或许有人已经使用多个 GPU,通过庞大的数据集预先训练了这些网络,这样一来我们就可以使用这些网络进行迁移学习。

迁移学习

如果我们要做一个计算机视觉的应用,可以下载别人花费好几周甚至几个月而做出来的开源的权重参数,通过迁移学习将公共的数据集的知识迁移到自己的问题上。

以猫咪检测器为例,我们需检测图片中的猫是 Tigger 还是 Misty,或者都不是。如果我们的训练集很小,从头开始训练一个深度网络结构是远远不够的。我们可以从GitHub或其它网站中找到一些神经网络开源的实现,将代码和权重都下载下来。假设这个ImageNet 数据集有1000 个不同的类别,因此这个网络会有一个 Softmax 单元,它可以输出 1000 个可能类别之一。 我们可以去掉这个 Softmax 层,创建自己的 Softmax 单元,将所有层看作是冻结的,而只需训练和Softmax 层有关的参数,用来输出 Tigger、Misty 和 neither 三个类别。

如果有大量的数据集,我们可以多训练后面的几层。总而言之,随着数据集的增加,我们冻结的层数就越来越少。极端情况下,也就是说我们有十分庞大的数据集,我们可以训练网络模型的所有参数,将其他研究者训练的模型参数作为初始化参数代替随机初始化,然后用梯度下降更新网络所有层的所有权重。

数据增强

与大多数机器学习问题相比,在计算机视觉领域当下最主要的问题是没有办法得到充足的数据。所以当我们训练计算机视觉模型的时候,数据增强就会有所帮助。常见的数据增强的方法有:

  1. 镜像翻转(Mirroring);
  2. 随机剪裁(Random Cropping);
  3. 色彩转换(Color shifting)。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值