视觉神经网络的演变

目录

前言

一 视觉深度网络的发展简史

二 视觉深度网络的模型演变

三 简单总结(参考上文)

1.LeNet

2.AlexNet

3.ZF-Net

 4.VGG-Nets

5.GoogLeNet

6.ResNet

7.DenseNet

四 后记


配套视频教程

https://www.bilibili.com/video/BV1TG4y1273c/?vd_source=61ce5faa12d7097e34d6373d9f1d2e6a

0_Pytorch实战前言_哔哩哔哩_bilibili 

前言

计算机视觉/机器视觉经历了主要两个阶段

  1. 科学家自主学习阶段。科学家/数学家/计算机专家 们呕心沥血,发明了各种提取图像特征的办法,如sift、Garbor, hsv 等各类特征,然后将各种特征组合起来丢给机器学习算法(如SVM),这是传统意义上的计算机视觉(虽说传统,也就是几年前的事儿)
  2. 计算机深度学习阶段。其实深度学习上个世纪50年代便有提出,但是受限于物理条件,效果不明显,所以经历了几次大起大落。随着近10年来计算机硬件性能的提升,以及对深度学习认识的深入,逐渐形成了以CNN为代表的视觉神经网络。其特点是人懒了,机器勤奋起来,之前由科学家苦思冥想特征提取方法,现在交给计算机来自己学习(说是学习,其实就是各种求导,各种调整参数,各种快速收敛)。如果说一阶导数可以得到边缘、线,二阶导数可以检测孤立点、噪声等。那N阶导数就很难直观描述了。但总归的依据就是求导可以获取到更细节的特征。

一句话总结:第一阶段主要是人主动寻找特征,第二阶段是机器主动寻找特征。

一 视觉深度网络的发展简史

发现一篇摘要性的文章,直接贴链接了,有需要的看看。

https://blog.csdn.net/u013162035/article/details/80940391

二 视觉深度网络的模型演变

发现一篇很优秀的总结性文章,也直接贴链接了。

https://www.cnblogs.com/skyfsm/p/8451834.html

三 简单总结(参考上文的图)

1.LeNet

跪点:定义了卷积神经网络的基本单元(卷积层,池化层,全连接层,非线性激活单元)

conv->pool->conv->pool->fcn>relu->fcn->relu

2.AlexNet

跪点:

  • 采用了更深的网络层次
  • GPU并行化
  • 用Relu 替代sigmoid,使用随机裁剪图像用于数据增广。
  • 引入了dropout,
  • 引入了LRU(局部相应归一层)

相较于LeNet 增加了网络深度(网络结构没有本质变化),由于增加了深度,训练就会耗时,所以又在训练上采用了一些技巧

3.ZF-Net

网络结构跟AlexNet没啥区别,只是调整了参数。ZF-Net只是将AlexNet第一层卷积核由11变成7,步长由4变为2,第3,4,5卷积层转变为384,384,256

 4.VGG-Nets

跪点:

  • 深度更深
  • 先用简单的方式解决问题,然后再逐渐加层,使用不同的模型来验证层数的影响(我觉得这个思路是VGG能提供的最大的亮点)
  • 用3*3的卷积核替换5*5 和7*7的核,减少参数量
  • 引入了1*1的卷积核

关于第三点的说明:

  • 3x3是最小的能够捕获像素八邻域信息的尺寸。
  • 两个3x3的堆叠卷基层的有限感受野是5x5;三个3x3的堆叠卷基层的感受野是7x7,故可以通过小尺寸卷积层的堆叠替代大尺寸卷积层,并且感受野大小不变。
  • 多个3x3的卷基层比一个大尺寸filter卷基层有更多的非线性(更多层的非线性函数),使得判决函数更加具有判决性。
  • 多个3x3的卷积层比一个大尺寸的filter有更少的参数,假设卷基层的输入和输出的特征图大小相同为C,那么三个3x3的卷积层参数个数3x(3x3xCxC)=27C2;一个7x7的卷积层参数为49C2;所以可以把三个3x3的filter看成是一个7x7filter的分解(中间层有非线性的分解, 并且起到隐式正则化的作用。(摘自https://blog.csdn.net/qzrdypbuqk/article/details/80104948?utm_source=blogxgwz4

关于第四点的说明

1*1的卷积核相当于没有改变输入的维度

1*1的卷积核实质上是将各个通道的加权相加得到新的特征

5.GoogLeNet

跪点:

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

这里引入了inception ,具体介绍参考https://my.oschina.net/u/876354/blog/1637819

GoogLeNet网络结构中有3个LOSS单元,这样的网络设计是为了帮助网络的收敛。在中间层加入辅助计算的LOSS单元,目的是计算损失时让低层的特征也有很好的区分能力,从而让网络更好地被训练。在论文中,这两个辅助LOSS单元的计算被乘以0.3,然后和最后的LOSS相加作为最终的损失函数来训练网络。

6.ResNet

该网络被推崇为里程碑式的网络

跪点:

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

下图为残差单元

为什么引入残差单元的原因:

从前面可以看到,随着网络深度增加,网络的准确度应该同步增加,当然要注意过拟合问题。但是网络深度增加的一个问题在于这些增加的层是参数更新的信号,因为梯度是从后向前传播的,增加网络深度后,比较靠前的层梯度会很小。这意味着这些层基本上学习停滞了,这就是梯度消失问题。深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,因此简单地去增加网络深度反而出现更高的训练误差,深层网络虽然收敛了,但网络却开始退化了,即增加网络层数却导致更大的误差,一个56层的网络的性能却不如20层的性能好,这不是因为过拟合(训练集训练误差依然很高),这就是烦人的退化问题。残差网络ResNet设计一种残差模块让我们可以训练更深的网络。

这里详细分析一下残差单元来理解ResNet的精髓。

从下图可以看出,数据经过了两条路线,一条是常规路线,另一条则是捷径(shortcut),直接实现单位映射的直接连接的路线,这有点类似与电路中的“短路”。通过实验,这种带有shortcut的结构确实可以很好地应对退化问题。我们把网络中的一个模块的输入和输出关系看作是y=H(x),那么直接通过梯度方法求H(x)就会遇到上面提到的退化问题,如果使用了这种带shortcut的结构,那么可变参数部分的优化目标就不再是H(x),若用F(x)来代表需要优化的部分的话,则H(x)=F(x)+x,也就是F(x)=H(x)-x。因为在单位映射的假设中y=x就相当于观测值,所以F(x)就对应着残差,因而叫残差网络。为啥要这样做,因为作者认为学习残差F(X)比直接学习H(X)简单!设想下,现在根据我们只需要去学习输入和输出的差值就可以了,绝对量变为相对量(H(x)-x 就是输出相对于输入变化了多少),优化起来简单很多。

考虑到x的维度与F(X)维度可能不匹配情况,需进行维度匹配。这里论文中采用两种方法解决这一问题(其实是三种,但通过实验发现第三种方法会使performance急剧下降,故不采用):

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

7.DenseNet

跪点:密集连接,每层与之前的层都又直接的连接,可以减缓梯度消失的现象。

四 后记

本文为总结文,主要记录一下自己的学习过程加深一下印象,同时分享几篇自己认为比较优秀的博客。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值