神经网络架构演变过程

这里写自定义目录标题

    • 一、开山之作:LeNet
    • 二、王者归来:AlexNet
    • ZFNet
    • VGG-Net
    • GoogLeNet
    • ResNet
    • DenseNet

博主现在已经研一了,过了个暑假,好像把所有东西都忘记的差不多了,所以先复习一遍。具体打算是:

  1. 卷积神经网络架构(1天)
  2. 目标检测(3天)
  3. 语义分割(1周,之前没怎么接触过)
  4. 着手看点做点工程项目
  5. 学一遍computer vision传统方法(主要是看prml,今天刚买,估计要几天才能到,这个和1/2/3不冲突,可以并行)
  6. 刷LeetCode(鉴于现在算法岗越来越激烈,还是要做好毕业开发岗的心理准备,并行)
  7. 英语听说读写(希望有人一起啊,互相监督,有的话请可以私聊qq:894525124)

好,下面开始正题。由于是复习,所以可能会写的比较简略,本片博文不是针对初学者的

一、开山之作:LeNet

神经网络架构演变过程_第1张图片
定义了CNN的最基本的架构:卷积层、池化层、全连接层。
该网络使用的方式是:conv1->pool->conv2->pool2再接全连接层。并且在进行卷积操作的时候,不需要进行padding,并且在max pooling之前没有relu操作,而且卷积核都相对较大,是5*5的。
神经网络架构演变过程_第2张图片

二、王者归来:AlexNet

神经网络架构演变过程_第3张图片
特殊之处:

  1. 更深的网络
  2. 数据增广
  3. relu
  4. dropout
  5. LRN

AlexNet针对的是1000类的分类问题,输入图片规定是256×256的三通道彩色图片,为了增强模型的泛化能力,避免过拟合,作者使用了随机裁剪的思路对原来256×256的图像进行随机裁剪,得到尺寸为3×224×224的图像,输入到网络训练。

看上图的网络架构,采用上下分开的两层操作的原因是在2012年GPU还不够发达,对如此大的计算量不适用,所以采用两个支路的形式。而现在要编写Alex代码时,就简单很多了,并不需要分为上下两个支路,完全可以合并起来一起写。

ZFNet

神经网络架构演变过程_第4张图片
网络架构和AlexNet可以说是一模一样的,只是进行了调参等操作,故不再赘述。

VGG-Net

神经网络架构演变过程_第5张图片
神经网络架构演变过程_第6张图片
VGG-16的结构非常整洁,深度较AlexNet深得多,里面包含多个conv->conv->max_pool这类的结构,VGG的卷积层都是same的卷积,即卷积过后的输出图像的尺寸与输入是一致的,它的下采样完全是由max pooling来实现。

3×3卷积核的优点:

  1. 多个3×3的卷基层比一个大尺寸filter卷基层有更多的非线性,使得判决函数更加具有判决性
  2. 多个3×3的卷积层比一个大尺寸的filter有更少的参数,假设卷基层的输入和输出的特征图大小相同为C,那么三个3×3的卷积层参数个数3×(3×3×C×C)=27CC;一个7×7的卷积层参数为49CC;所以可以把三个3×3的filter看成是一个7×7filter的分解(中间层有非线性的分解)

1*1卷积核的优点:

作用是在不影响输入输出维数的情况下,对输入进行线性形变,然后通过Relu进行非线性处理,增加网络的非线性表达能力。

GoogLeNet

引入了Inception结构:神经网络架构演变过程_第7张图片
闪光点:

  1. 引入Inception结构
  2. 中间层的辅助LOSS单元
  3. 后面的全连接层全部替换为简单的全局平均pooling

引入Inception结构可以显著减少计算量

ResNet

神经网络架构演变过程_第8张图片
闪光点:

  • 层数非常深,已经超过百层
  • 引入残差单元来解决退化问题

从前面可以看到,随着网络深度增加,网络的准确度应该同步增加,当然要注意过拟合问题。但是网络深度增加的一个问题在于这些增加的层是参数更新的信号,因为梯度是从后向前传播的,增加网络深度后,比较靠前的层梯度会很小。这意味着这些层基本上学习停滞了,这就是梯度消失问题。深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,因此简单地去增加网络深度反而出现更高的训练误差,深层网络虽然收敛了,但网络却开始退化了,即增加网络层数却导致更大的误差,比如下图,一个56层的网络的性能却不如20层的性能好,这不是因为过拟合(训练集训练误差依然很高),这就是烦人的退化问题。残差网络ResNet设计一种残差模块让我们可以训练更深的网络。
神经网络架构演变过程_第9张图片
由于退化问题的存在,所以引入了残差连接在解决这个退化问题。
神经网络架构演变过程_第10张图片
考虑到x的维度与F(X)维度可能不匹配情况,需进行维度匹配。这里论文中采用两种方法解决这一问题(其实是三种,但通过实验发现第三种方法会使performance急剧下降,故不采用):

  1. zero_padding:对恒等层进行0填充的方式将维度补充完整。这种方法不会增加额外的参数
  2. projection:在恒等层采用1x1的卷积核来增加维度。这种方法会增加额外的参数

下图展示了两种形态的残差模块,左图是常规残差模块,有两个3×3卷积核卷积核组成,但是随着网络进一步加深,这种残差结构在实践中并不是十分有效。针对这问题,右图的“瓶颈残差模块”(bottleneck residual block)可以有更好的效果,它依次由1×1、3×3、1×1这三个卷积层堆积而成,这里的1×1的卷积能够起降维或升维的作用,从而令3×3的卷积可以在相对较低维度的输入上进行,以达到提高计算效率的目的。
神经网络架构演变过程_第11张图片

DenseNet

闪光点:

  • 密集连接:缓解梯度消失问题,加强特征传播,鼓励特征复用,极大的减少了参数量

DenseNet 是一种具有密集连接的卷积神经网络。在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入。下图是 DenseNet 的一个dense block示意图,一个block里面的结构如下,与ResNet中的BottleNeck基本一致:BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3) ,而一个DenseNet则由多个这种block组成。每个DenseBlock的之间层称为transition layers,由BN−>Conv(1×1)−>averagePooling(2×2)组成
神经网络架构演变过程_第12张图片

密集连接不会带来冗余吗?不会!密集连接这个词给人的第一感觉就是极大的增加了网络的参数量和计算量。但实际上 DenseNet 比其他网络效率更高,其关键就在于网络每层计算量的减少以及特征的重复利用。DenseNet则是让l层的输入直接影响到之后的所有层,它的输出为:xl=Hl([X0,X1,…,xl−1]),其中[x0,x1,…,xl−1]就是将之前的feature map以通道的维度进行合并。并且由于每一层都包含之前所有层的输出信息,因此其只需要很少的特征图就够了,这也是为什么DneseNet的参数量较其他模型大大减少的原因。这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题

在这里插入图片描述

该网络的内存占用十分严重!

你可能感兴趣的:(计算机视觉cv)