一、说明
了解和实现 ResNet 和 ResNeXt 的架构以实现最先进的图像分类:从Microsoft到 Facebook [第 1 部分],在这篇由两部分组成的博客文章中,我们将探讨残差网络。更具体地说,我们将讨论Microsoft研究和Facebook AI研究发布的三篇论文,最先进的图像分类网络 - ResNet和ResNeXt架构,并尝试在Pytorch上实现它们。
二、残差网络历史回顾
这是由两部分组成的系列文章的第 1 部分,解释了探索残差网络的博客文章。
我们将回顾以下三篇介绍和改进残差网络的论文:
- [篇一] 用于图像识别的深度残差学习(链接到Microsoft研究的论文)
- [第2部分] 深度残差网络中的身份映射(链接到Microsoft研究的论文)
- [第2部分] 深度神经网络的聚合残差转换(链接到Facebook AI Research的论文))
2.1 ResNet成功了吗?
- 在ILSVRC 1分类竞赛中获得第一名,前2015名错误率为5.3%(集成模型)
- 在ILSVRC和COCO 1竞赛中荣获ImageNet检测,ImageNet本地化,Coco检测和Coco分割的第一名。
- 用 ResNet-16 替换 Faster R-CNN 中的 VGG-101 层。他们观察到相对改善了28%
- 具有 100 层和 1000 层的高效训练网络。
2.2 ResNet解决了什么问题?
当深度网络开始收敛时,就会暴露出一个退化问题:随着网络深度的增加,精度变得饱和,然后迅速下降。
三、看到多余无效的行动:
让我们通过向浅层网络添加更多层来获取其更深层次的网络。效果能如何?
3.1 最坏情况:
更深的模型的早期层可以用浅层网络代替,其余层可以只充当恒等函数(输入等于输出)。
3.2 有益的场景
在更深的网络中,额外的层比较浅的对应部分更好地近似映射,并显着减少误差。
3.3 实验
在最坏的情况下,浅层网络和深层变体都应提供相同的精度。在有益的场景情况下,较深的模型应比较浅的对应部分提供更好的准确性。 但是我们目前的求解器的实验表明,更深的模型表现不佳。因此,使用更深的网络会降低模型的性能。本文试图使用深度残差学习框架来解决这个问题。
四、如何解决“深度很深,精度不高”的问题
常规的神经网络运算中,层x映射成层y是直接映射。我们这里做个改动:设是非线性函数,定义残差方程它可以重构为,其中 F(x) 和 x 分别表示堆叠的非线性层和恒等, 函数(input=output)。
作者的假设是,优化残差映射函数 F(x) 比优化原始的、未引用的映射 H(x) 更容易。
4.1 残余块背后的直觉
如果恒等映射是最优的,我们可以轻松地将残差推到零(F(x) = 0),而不是通过非线性层堆栈拟合恒等映射(x,输入=输出)。用简单的语言来说,很容易想出像F(x)=0这样的解决方案,而不是F(x)=x,使用非线性CNN层堆栈作为函数(想想看)。所以,这个函数F(x)就是作者所说的残差函数。
作者做了几个测试来验证他们的假设。现在让我们逐一看一下。
4.2 测试用例:
采用普通网络(VGG 类型的 18 层网络)(网络 1)和它的更深层次变体(34 层,网络 2),并将残差层添加到网络 2(具有残差连接的 34 层,网络 3)。
设计网络:
- 主要使用3 * 3过滤器。
- 使用 CNN 层进行下采样,步幅为 2。
- 全局平均池化层和 1000 路全连接层,最后是 Softmax。
普通 VGG 和带残余块的 VGG
残差连接有两种类型:
- 当输入和输出具有相同维度时,可以直接使用标识快捷方式 (x)。
输入和输出尺寸相同的残差功能
2. 当尺寸发生变化时,A) 快捷方式仍执行标识映射,并用增加的维度填充额外的零条目。B)投影快捷方式用于使用以下公式匹配尺寸(由1 * 1 conv完成)
当输入和输出尺寸不同时,残差块功能。
第一种情况不添加额外的参数,第二种情况以 W_{s} 的形式添加
结果:
尽管 18 层网络只是 34 层网络中的子空间,但它的性能仍然更好。ResNet 在网络更深的情况下表现显着优于
4.3 更深入的研究
研究了以下网络
每个 ResNet 块要么是 2 层深(用于像 ResNet 18、34 这样的小型网络)要么是 3 层深(ResNet 50、101、152)。
Pytorch 实现可以在这里看到:
PyTorch/Vision
视觉 - 特定于计算机视觉的数据集、转换和模型
github.com
瓶颈类实现 3 层块,基本块实现 2 层块。它还实现了所有ResNet架构,并在ImageNet上训练了预训练的权重。
4.4 观察:
- ResNet 网络收敛速度比普通对应部分更快。
- 身份与投影在所有层中使用投影快捷方式(公式-2)的增量增益非常小。因此,所有 ResNet 块仅使用标识快捷方式,投影快捷方式仅在尺寸更改时使用。
- ResNet-34 的前 5 名验证误差比 BN-inception 和 VGG 高出 5.71%。ResNet-152 实现了 5.4% 的前 49 名验证错误。6 个不同深度模型的集合实现了 5.3% 的前 57 验证误差。获得ILSVRC-1第一名
五、使用 Pytorch 实现
我在这里对几乎所有图像分类网络都有详细的实现。快速阅读可以让您在几分之一秒内实现和训练 ResNet。Pytorch 已经有了自己的实现,我的看法只是在进行迁移学习时考虑不同的情况。
几乎所有使用 PyTorch 的图像分类问题
这是一个为PyTorch构建代码库的实验性设置。它的主要目的是使用转移更快地进行实验......
becominghuman.ai
我写了一篇详细的博客文章 迁移学习.虽然代码是在这里用 keras 实现的,但这些想法更抽象,可能对您在原型设计中有用
六、关于该系列
这是由两部分组成的系列文章的第 2 部分,解释了探索残差网络的博客文章。
- 了解和实现 ResNet 架构 [第 1 部分]
- 理解和实现 ResNeXt 架构[第 2 部分]
对于已经理解第 1 部分的人来说,这将是一个相当简单的阅读。我将遵循与第 1 部分相同的方法。
- 关于深度残差网络中的身份映射的简要讨论(链接到论文)[重要的案例研究]
- ResNeXt Architecture Review (链接到论文))
- ResNeXt的实验研究
- ResNeXt 在 PyTorch 中的实现
七、深度残差网络中的身份映射简述
本文通过用不同的函数替换恒等映射(x)来理论理解为什么残差网络中不存在梯度消失问题以及跳过连接的作用。
残差网络方程
F 是堆叠的非线性层,f 是 Relu 激活函数。
他们发现,当f(y1)和h(x1)都是恒等映射时,信号可以直接从一个单位传播到任何其他单位,无论是向前还是向后。此外,当它们都是标识映射时,两者都实现了最小的错误率。让我们分别看一下每个案例。
7.1. 寻找最优 h(x_{l}) 函数
案例-1,λ = 0: 这将是一个普通的网络。由于 w2、w1、w0 都在 {-1, 1} 之间,因此梯度随着网络深度的增加而消失。这清楚地显示了梯度消失问题
案例-2,Lambda >1:在这种情况下,反向传播值逐渐增加并导致梯度爆炸。
案例-3,Lambda <1: 对于浅层网络,这可能不是问题。但对于超大型网络,在大多数情况下,权重+lambda仍然小于<1,并且它实现了与case-1相同的问题。
案例-4,Lambda =1: 在这种情况下,每个权重都增加 1,这消除了与非常大的数字相乘的问题,如情况 2 和小数字(如情况 1),并起到很好的屏障作用。
该论文还通过在跳过连接中添加反向传播和卷积层进行审查,发现网络性能下降。以下是他们尝试过的 5 个实验网络,其中只有第一个 (a) 给出了最小的错误率。
7.2. 找到最优 f(y_{l}) 函数
在ResNet-5和ResNet-110上对上述164种架构进行了研究,并获得了以下结果。在这两个网络中,预激活的性能都优于所有其他网络。因此,使用简单的加法和恒等映射而不是Relu f(x)函数更合适。在残差层中拥有Relu和BN层有助于网络快速优化并更好地正则化(更少的测试误差),从而减少过度拟合。
八、结论
因此,拥有身份快捷方式连接(案例-1)和身份添加后激活对于使信息传播顺利至关重要。消融实验与上面讨论的推导一致。
8.1 ResNeXt 架构评论
ResNeXt 在 ILSVRC 2 分类任务中获得了第二名,并且在 Coco 检测和 ImageNet-2016k 集方面的性能也比 ResNet 同类产品有所提高。
这是一篇非常简单的论文,它引入了一个名为“基数”的新术语。本文只是简单地解释了这个术语,并在ResNet网络中使用它,并进行了各种消融研究。
该论文多次尝试描述Inception网络的复杂性以及为什么ResNeXt架构很简单。我不会在这里这样做,因为它需要读者理解Inception网络。我在这里只谈谈架构。
- 上图区分了简单的ResNet块和ResNeXt博客。
- 它遵循拆分-转换-聚合策略。
- ResNeXt 块内的路径数定义为基数。 在上图中 C=32
- 所有路径都包含相同的拓扑。
- 具有高基数不是具有高深度和宽度,而是有助于减少验证错误。
- 与ResNet对应部分相比,ResNeXt尝试嵌入更多的子空间。
- 两种体系结构具有不同的宽度。ResNet 中的第 1 层有一个宽度为 64 的卷积层,而 ResNext 中的第 1 层有 32 个不同的卷积层,宽度为 4(32*4 宽度)。尽管 ResNeXt 的整体宽度较大,但两种架构的参数数量相同(~70k)(ResNet 256*64+3*3*64*64+64*26)(ResNeXt C*(256*d+3*d*d+d*3),C=256 和 d=32)
以下是ResNet和ResNeXt之间的架构差异
因此,resnext_32*4d 表示具有 4 个瓶颈 [上图中的一个块] 层的网络,每层的基数为 32。稍后我们将观察 PyTorch 中的 resnext_32*4D 和 resnext_64*4D 实现。
8.2 研究:
1 基数与宽度:随着 C 从 1 增加到 32,我们可以清楚地看到 top-1% 错误率的下降。因此,通过减小宽度来增加 C 可以提高模型的性能。
2. 增加基数与更深/更宽:基本上研究了 3 个案例。1) 层数从 200 层增加到 101 层。2)通过增加瓶颈宽度来扩大。3)通过加倍C来增加基数。
他们观察到,增加C可以提供更好的性能改进。以下是结果。
九、结论
不同 ResNeXt 架构的集合给出了 5.3% 的前 03 名错误率,从而在 ILSVRC 竞赛中排名第二。