ResNet
最后是,2015 年 ILSVRC 挑战赛的赢家 Kaiming He 等人开发的 Residual Network(或 ResNet),该网络的 top-5 误率低到惊人的 3.6%,它使用了一个非常深的 CNN,由 152 层组成。 能够训练如此深的网络的关键是使用跳过连接(skip connection,也称为快捷连接):一个层的输入信号也被添加到位于下一层的输出。 让我们看看为什么这是有用的。
当训练一个神经网络时,目标是使其模拟一个目标函数h(x)
。 如果将输入x添加到网络的输出中(即添加跳过连接),那么网络将被迫模拟f(x)= h(x) - x
而不是h(x)
。 这被称为残留学习(见图 13-12)。
当你初始化一个普通的神经网络时,它的权重接近于零,所以网络只输出接近零的值。 如果添加跳过连接,则生成的网络只输出其输入的副本; 换句话说,它最初对身份函数进行建模。 如果目标函数与身份函数非常接近(常常是这种情况),这将大大加快训练速度。
而且,如果添加了许多跳转连接,即使几个层还没有开始学习,网络也可以开始进行(见图 13-13)。 由于跳过连接,信号可以很容易地通过整个网络。 深度剩余网络可以看作是一堆剩余单位,其中每个剩余单位是一个有跳过连接的小型神经网络。
现在让我们看看 ResNet 的架构(见图 13-14)。 这实际上是令人惊讶的简单。 它的开始和结束与GoogLeNet完全一样(除了没有 dropout 层),而在两者之间只是一堆很简单的残余单位。 每个残差单元由两个卷积层组成,使用3×3
的内核和保存空间维度(步幅 1,SAME
填充),批量归一化(BN)和 ReLU 激活。
需要注意的是特征映射的数量每隔几个残差单位会加倍,同时它们的高度和宽度减半(使用步幅 2 卷积层)。 发生这种情况时,输入不能直接添加到剩余单元的输出中,因为它们不具有相同的形状(例如,此问题影响图 13-14 中的虚线箭头表示的跳过连接)。 为了解决这个问题,输入通过一个1×1
卷积层,步长2和正确数量的输出特征映射(见图 13-15)。
ResNet-34 是具有 34 个层(仅计算卷积层和完全连接层)的 ResNet,包含 3 个剩余单元输出 64 个特征映射,4 个剩余单元输出 128 个特征映射,6 个剩余单元输出 256 个特征映射,3 个剩余单元输出 512 个特征映射。
ResNet-152 更深,使用稍微不同的剩余单位。 他们使用三个卷积层,而不是两个 256 个特征映射的3×3
的卷积层,它们使用三个卷积层:第一个卷积层只有 64 个特征映射(少 4 倍),这是一个瓶颈层(已经讨论过) ,然后是具有 64 个特征映射的3×3
层,最后是具有 256 个特征映射(4×64
)的另一个1×1
卷积层,以恢复原始深度。ResNet-152 包含三个这样的剩余单位,输出 256 个特征映射,然后是 8 个剩余单位,输出 512 个特征映射,高达 36 个剩余单位,输出 1024 个特征映射,最后是 3 个剩余单位,输出 2048 个特征映射。
正如你所看到的,这个领域正在迅速发展,每年都会有各种各样的架构出现。 一个明显的趋势是 CNN 越来越深入。 他们也越来越轻量,需要越来越少的参数。 目前,ResNet 架构既是最强大的,也是最简单的,所以它现在应该是你应该使用的,但是每年都要继续关注 ILSVRC 的挑战。 2016 年获奖者是来自中国的 Trimps-Soushen 团队,他们的出错率惊人的缩减到 2.99%。 为了达到这个目标,他们训练了以前模型的组合,并将它们合并为一个整体。 根据任务的不同,降低的错误率可能会或可能不值得额外的复杂性。
还有其他一些架构可供您参考,特别是 VGGNet(2014 年 ILSVRC 挑战赛的亚军)和 Inception-v4(将 GooLeNet 和 ResNet 的思想融合在一起,实现了接近 3% 的 top-5 误差 ImageNet 分类率)。
实施我们刚刚讨论的各种CNN架构真的没什么特别的。 我们之前看到如何构建所有的独立构建模块,所以现在您只需要组装它们来创建所需的构架。 我们将在即将开始的练习中构建 ResNet-34,您将在 Jupyter 笔记本中找到完整的工作代码。