机器学习系列(6):ResNet、Inception原理及ResNet的python实现

时间:2024-06-01 08:53:28

机器学习系列(6)

计算机视觉–ResNets、Inception原理及ResNets的Python实现

计算机视觉中的网络及方法:

  • 经典网络
  • 残差网络
  • ResNets有效原因
  • 1×1卷积
  • Inception网络
  • 迁移学习
  • 数据扩充

Python实现:
- 见文章内容

申明

本文原理解释及公式推导部分均由LSayhi完成,允许转载注明出处;代码实现部分的框架由Coursera提供,由LSayhi完成,详细数据及代码可在github查阅。
https://github.com/LSayhi/DeepLearning

****博客:https://blog.****.net/LSayhi

微信公众号:AI有点可ai

一、计算机视觉中的网络及方法

1.经典网络

  • 在深度学习的发展中,诞生了许多经典网络模型,这些网络给后来的网络结构提供了重大的参考,有的现在已经不怎么使用了,但是不管怎么样,这些网络的提出,不论在当时还是现在都有一定的意义,比如LeNet5、AlexNet、VGGNet等。这些网络一般是由卷积层和池化层以及输入输出层复合而成,通常,在一个或若干个卷积层之后,会连接一个池化层,在网络的最后几层,一般是将卷积结构转成全连接结构,然后再输出层使用softmax进行分类,随着网络的发展,网络的深度也越来越深,参数也越来越多。

2.残差网络

  • 残差网络(Residual Networks,简称ResNets)是由残差块等复合而成的网络结构,利用残差网络可以将网络层数做到很深,以取得更好的表现。我们知道,在网路的训练中,可能会遇到梯度消失或梯度爆炸的现象,导致无法成功训练,在现代网络中,通常网络的层数很大,因此发生梯度消失和梯度爆炸的可能性大大增加。残差网络可以有效防止这些现象的发生。
机器学习系列(6):ResNet、Inception原理及ResNet的python实现

Figure 1 : plain network

机器学习系列(6):ResNet、Inception原理及ResNet的python实现

Figure 2 : skip connection

  • 残差块与跳跃连接。残差块是组成残差网络的重要子系统。如图Figure 1示例,这是一个一般的网络结构,每一层都依次和下一层连接,第L层的输出取决于第L-1的的输出和两层之间的连接方式。残差网络在这个基础上,加入了跳跃连接(skip connection),如图Figure 2所示,机器学习系列(6):ResNet、Inception原理及ResNet的python实现在普通的网络中,是没有机器学习系列(6):ResNet、Inception原理及ResNet的python实现这一项的,这个加入的项是从第机器学习系列(6):ResNet、Inception原理及ResNet的python实现层直接连接过来的,中间隔着其它层,因此我们把这个连接称作跳跃连接。如图Figure 3所示,这是一个残差网络的结构示意图,随着层数的增加,普通的深度网络和残差网络的loss的比较。
机器学习系列(6):ResNet、Inception原理及ResNet的python实现

Figure 3 : residual network 示例

3.残差网络有效原因

  • 一个网络的深度越深,它在训练集上的表现就有所减弱,这让我们不能把网络做得太深,然而,构造更深的网络可以得到更高级的特征,为了解决这一矛盾,残差网络就发挥了作用。通常,我们希望能做到在加深网络的深度同时不减弱网络的性能。因为一个在训练集上表现良好的网络是其在开发集和测试集取得优异表现的基础。残差网络能够很容易学习到恒等式并且不影响网络性能,至少不降低性能,有些时候反而能学习到前馈网络很难学习到的映射关系,能提升网络性能。这一点可以通过一下例子直观理解,见Figure 4,当W和b为0时,残差网络模块就学习到了恒等式。
机器学习系列(6):ResNet、Inception原理及ResNet的python实现

Figure 4 : 学习恒等式

4.1×1卷积

  • 1×1卷积,即是卷积核的大小是1×1×Nc大小的的卷积操作,也称network in network。当Nc=1时,如Figure 5所示,相当于把每一个像素点乘以卷积核中的值,当Nc>1时(即图像的通道数大于1时),其相当于对Nc个通道进行加权求和,如图Figure 6,当卷积核的数量为filters时,输出最后一个维度则等于filters。1×1卷积可以改变图像的通道数,通常是减小或保持不变,当然也可以增加,这取决于卷积核的个数,举个例子说明1×1卷积的作用,如图Figure 7,卷积核数量为192时,输出通道数保持不变,通道数为32时,输出通道数减小为32。
机器学习系列(6):ResNet、Inception原理及ResNet的python实现

Figure 5 : Nc=1与Nc>1

机器学习系列(6):ResNet、Inception原理及ResNet的python实现

Figure 6 : 多个卷积核

机器学习系列(6):ResNet、Inception原理及ResNet的python实现

Figure 7 : 改变卷积核数量以改变通道大小

谷歌Inception网络:

  • 谷歌Inception网络基本思想是让网络自己决定需要什么样卷积核以及是否需要池化操作。我们知道。卷积核的大小需要我们去确定,比如1×1,3×3,5×5等,但是我们不好判断哪种最合适,以及池化层是否需要在某个位置添加,Inception网络就是让网络学习参数,从而决定采用什么样的过滤器的组合。Figure 8给出了一个Inception网络的例子,通过使用same卷积,这些输出保持相同维度,只有通道数的不同。

    机器学习系列(6):ResNet、Inception原理及ResNet的python实现

    Figure 8 : Inception网络

    机器学习系列(6):ResNet、Inception原理及ResNet的python实现

    Figure 9 : 使用1*1卷积减小计算成本

  • 不难发现,Inception网络有一个缺点就是需要更多的参数,因此会增加计算成本。那么,此时如果在输入输出之间先经过一个1×1卷积,就可以先降低通道数,从而使得计算量下降,这就是1×1卷积在Inception网络中的应用,Figure 9是一个示例。其可以用在单个Inception模块中,如图Figure 10所示是一个完整的单个Inception模块(类似resnet的单模块),然后其可以组成Figure 11所示的完整Inception网络,网络由多个Inception模块组成,当然还可以加上一些分支用来对提取到的特征进行预测分类等。

    机器学习系列(6):ResNet、Inception原理及ResNet的python实现

    Figure 10 : Inception模块

    机器学习系列(6):ResNet、Inception原理及ResNet的python实现

    Figure 11 : Inception网络

迁移学习

  • 众所周知,训练一个有效的深度网络需要很长的时间和一些调参技巧,如果遇到一个问题就直接训练模型,那么花费的时间将相当长,而且,有时候由于数据量少,也很难通过数据训练出有效的网络。这时迁移学习就派上了用场,迁移学习可以允许我们使用已经提出的网络模型和其训练好的参数,稍作修改,就很可能解决这两个问题。具体来说,假如你要训练一个猫狗猪分类器,你可以从开源网站上下载一个分类器,假设这个分类器可以识别100种动物类别,那么你可以将最后的softmax层从100个输出改为3个,然后保持其它参数不变,只训练和softmax层有关的参数,这样就可以训练出一个良好的识别猫狗猪的网络模型。当然,如果你要识别的是20种动物,你可能需要更改更多的参数,比如说将网络最后几层的参数都进行训练,然后softmax20个输出。能使用迁移学习的原因是卷积神经网络的每一步操作都相当于在提取图像特征,参数即是提取特征的方法。

数据扩充

  • 在训练网络时,可能会遇到训练集不够的情况,使得网络很难训练,这时就可以考虑数据扩充方法,扩充训练集,从而更好地训练网络。在计算机视觉领域,常见的数据扩充手段有图像镜像、图像颠倒、图像扭曲、图像变色等等,如图机器学习系列(6):ResNet、Inception原理及ResNet的python实现。将这些操作应用在原始数据集上,可以产生很多新的图像,把原始图像数据集和新产生的图像数据集合并为一个新的数据集,这就是计算机视觉中的数据扩充。
    机器学习系列(6):ResNet、Inception原理及ResNet的python实现

    Figure 12 : 数据扩充

本文相应的代码及资料已经以.ipynb文件和.pdf形式在github中给出。

.ipynb文件在链接/Coursera-deeplearning深度学习/课程4/week2/

.pdf文件在链接/Coursera-deeplearning深度学习

github地址:https://github.com/LSayhi/DeepLearning

▼更多原创干货和最新资讯,请关注我吧▼
机器学习系列(6):ResNet、Inception原理及ResNet的python实现