论文阅读

其实论文的思想在今天看来是不难的,不过在当时 ResNet 提出的时候可是横扫了各大分类任务,这个网络解决了随着网络的加深,分类的准确率不升反降的问题。通过一个名叫“残差”的网络结构(如下图所示),使作者可以只通过简单的网络深度堆叠便可达到提升准确率的目的。

res算法(残差网络论文阅读及示例代码)(1)

残差结构

残差结构的处理过程分成两个部分,左边的 F(X) 与右边的 X,最后结果为两者相加。其中右边那根线不会对 X 做任何处理,所以没有可学习的参数;左边部分 F(X) 为网络中负责学习特征的部分,把整个残差结构看做是 H(X) 函数的话,则负责学习的部分可以表示为 H(X)=F(X)-X,这个结构学习的其实是输出结果与输入的差值,这也是残差名字的由来。完整的 ResNet 网络由多个上图中所示的残差结构组成,每个结构学习的都是输出与输入之间的差值,通过步步逼近,达到了比直接学习输入好得多的效果。

文中残差结构的具体实现分为两种,首先介绍 ResNet-18 与 ResNet-34 使用的残差结构称为 Basic Block,如下图所示,图中的结构包含了两个卷积操作用于提取特征。

res算法(残差网络论文阅读及示例代码)(2)

Basic Block

对应到代码中,这是 Pytorch 自带的 ResNet 实现中的一部分,跟上图对应起来看更加好理解,我个人比较喜欢论文与代码结合起来看,因为我除了需要知道原理之外,也要知道如何去使用,而代码更给我一种一目了然的感觉:

res算法(残差网络论文阅读及示例代码)(3)

basic block

另一种残差结构称为 Bottleneck,就是瓶颈的意思:

res算法(残差网络论文阅读及示例代码)(4)

作者起名字真的很形象,网络结构也正如这瓶颈一样,首先做一个降维,然后做卷积,然后升维,这样做的好处是可以大大减少计算量,专门用于网络层数较深的的网络,ResNet-50 以上的网络都有这种基础结构构成(不同层级的输入输出维度可能会不一样,但结构类似):

res算法(残差网络论文阅读及示例代码)(5)

Pytorch 中的代码,注意到上图中为了减少计算量,作者将 256 维的输入缩小了 4 倍变为 64 进入卷积,在升维时需要升到 256 维,对应代码中的 expansion 参数:

res算法(残差网络论文阅读及示例代码)(6)

bottleneck

由上面介绍的基本结构再加上池化以及全连接层,就构成了各种完整的网络:

res算法(残差网络论文阅读及示例代码)(7)

图中的网络在 Pytorch 中都已经集成进去了,而且都是预训练好的,我们可以在预训练好的模型上面训练自己的分类器,大大减少我们的训练时间。下面介绍一下如何使用 ResNet。

在 Pytorch 中使用 ResNet

Pytorch 是一个对初学者很友好的深度学习框架,入门的话非常推荐,官方提供了一小时入门教程:https://pytorch.org/tutorials/beginner/deep_learning_60min_blitz.html

在 Pytorch 中使用 ResNet 只需要 4 行代码:

res算法(残差网络论文阅读及示例代码)(8)

PS:欢迎关注我的微信公众号 [MachineLearning学习之路],和我一起学习 python,深度学习,计算机视觉 !

,