res算法(残差网络论文阅读及示例代码)
其实论文的思想在今天看来是不难的,不过在当时 ResNet 提出的时候可是横扫了各大分类任务,这个网络解决了随着网络的加深,分类的准确率不升反降的问题。通过一个名叫“残差”的网络结构(如下图所示),使作者可以只通过简单的网络深度堆叠便可达到提升准确率的目的。
残差结构
残差结构的处理过程分成两个部分,左边的 F(X) 与右边的 X,最后结果为两者相加。其中右边那根线不会对 X 做任何处理,所以没有可学习的参数;左边部分 F(X) 为网络中负责学习特征的部分,把整个残差结构看做是 H(X) 函数的话,则负责学习的部分可以表示为 H(X)=F(X)-X,这个结构学习的其实是输出结果与输入的差值,这也是残差名字的由来。完整的 ResNet 网络由多个上图中所示的残差结构组成,每个结构学习的都是输出与输入之间的差值,通过步步逼近,达到了比直接学习输入好得多的效果。
文中残差结构的具体实现分为两种,首先介绍 ResNet-18 与 ResNet-34 使用的残差结构称为 Basic Block,如下图所示,图中的结构包含了两个卷积操作用于提取特征。
Basic Block
对应到代码中,这是 Pytorch 自带的 ResNet 实现中的一部分,跟上图对应起来看更加好理解,我个人比较喜欢论文与代码结合起来看,因为我除了需要知道原理之外,也要知道如何去使用,而代码更给我一种一目了然的感觉:
basic block
另一种残差结构称为 Bottleneck,就是瓶颈的意思:
作者起名字真的很形象,网络结构也正如这瓶颈一样,首先做一个降维,然后做卷积,然后升维,这样做的好处是可以大大减少计算量,专门用于网络层数较深的的网络,ResNet-50 以上的网络都有这种基础结构构成(不同层级的输入输出维度可能会不一样,但结构类似):
Pytorch 中的代码,注意到上图中为了减少计算量,作者将 256 维的输入缩小了 4 倍变为 64 进入卷积,在升维时需要升到 256 维,对应代码中的 expansion 参数:
bottleneck
由上面介绍的基本结构再加上池化以及全连接层,就构成了各种完整的网络:
图中的网络在 Pytorch 中都已经集成进去了,而且都是预训练好的,我们可以在预训练好的模型上面训练自己的分类器,大大减少我们的训练时间。下面介绍一下如何使用 ResNet。
在 Pytorch 中使用 ResNetPytorch 是一个对初学者很友好的深度学习框架,入门的话非常推荐,官方提供了一小时入门教程:https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html
在 Pytorch 中使用 ResNet 只需要 4 行代码:
PS:欢迎关注我的微信公众号 [MachineLearning学习之路],和我一起学习 python,深度学习,计算机视觉 !
,免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com