目录
配套视频教程
https://www.bilibili.com/video/BV1TG4y1273c/?vd_source=61ce5faa12d7097e34d6373d9f1d2e6a
前言
计算机视觉/机器视觉经历了主要两个阶段
- 科学家自主学习阶段。科学家/数学家/计算机专家 们呕心沥血,发明了各种提取图像特征的办法,如sift、Garbor, hsv 等各类特征,然后将各种特征组合起来丢给机器学习算法(如SVM),这是传统意义上的计算机视觉(虽说传统,也就是几年前的事儿)
- 计算机深度学习阶段。其实深度学习上个世纪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
跪点:密集连接,每层与之前的层都又直接的连接,可以减缓梯度消失的现象。
四 后记
本文为总结文,主要记录一下自己的学习过程加深一下印象,同时分享几篇自己认为比较优秀的博客。