CNN经典网络模型架构学习之Resnet

2025-9-30|2026-3-9
Pavel Han
Pavel Han
date
Sep 30, 2025
slug
2025-09-30-the-classical-CNN-network-Resnet
status
Published
tags
CNN
summary
Resnet网络架构是由微软亚洲研究院的何恺明等人在2015年提出,其论文为《Deep Residual Learning for Image Recognition》,在2015年的ImageNet图像识别竞赛中获得了分类、检测、定位等多个任务的冠军。这个模型的核心贡献在于解决了深层网络的训练难题,使得训练上百层甚至上千层的网络成为可能,极大地推动了计算机视觉的发展。
type
Post
category
AI
AI summary
Resnet网络架构是由微软亚洲研究院的何恺明等人在2015年提出,其论文为《Deep Residual Learning for Image Recognition》,在2015年的ImageNet图像识别竞赛中获得了分类、检测、定位等多个任务的冠军。这个模型的核心贡献在于解决了深层网络的训练难题,使得训练上百层甚至上千层的网络成为可能,极大地推动了计算机视觉的发展。

深层网络的训练问题

在Resnet网络架构提出之前,人们在进行深度神经网络的研究和训练过程中发现:
  • 网络的层次结构越深,层次越多,从理论上看其表达能力就越强,就越能够用于处理复杂的问题。
  • 但是,当网络层数达到一定程度之后,模型训练和识别的准确率反而会下降。这种情况下的下降不是过拟合的问题,因为无论是训练还是验证数据的准确率都会变差。网络层数的增加,不仅没有优化网络的性能,反而导致其输出的精度指标变差,这个问题被称为深度网络的退化问题。
如下图所示,更深的网络层数(56层 vs 20层)不仅没有带来更加的效果,反而在训练集和测试集上均又有所“退化”。
notion image
需要注意的是,resnet所面对的问题,并非是深度网络训练过程中梯度反向传递时存在的梯度消失和梯度爆炸的问题。梯度消失和梯度爆炸的问题,是因为深度网络的层数增加之后,在训练过程的梯度向前反向传递流程中,梯度数值趋向为0或者始终保持为无穷大,导致网络参数几乎无法更新或者保持为发散状态的情况。实际上这两个问题在网络中增加BatchNorm的方式已经得到解决。Resnet面对的网络退化”问题,是一个独立于梯度消失/爆炸的全新问题。
Resnet通过在模型的架构设计中引入残差块的方式,解决了以上的网络退化问题,自此深度网络的层数得到了大幅度的提升。从下图可以看到,2014年的ImageNet数据集图像识别竞赛的冠军得主GoogLeNet只有22层,而到了2015年的冠军ResNet,其网络深度就达到了152层。
notion image

残差块

传统的神经网络结构,一般都是将不同的卷积层、池化层、全连接层等按照一定的顺序简单的连接在一起,并且网络中的每一层只接收来自其上一层的信息,不会跨越层次结构接收更靠前的层的输出,并且每一层的输出也只会传递给下一层。如下图左侧正常块的各层连接模式。这样的层次结构模式,在网络层次加深以后,这种单一的连接方式会导致网络性能的退化。
而ResNet引入了残差块的概念。在传统的网络连接中,加入了短连接,模型的输入数据可以通过跨层连接的方式,更快的向前传播。如下图右侧所示。
notion image

残差映射为何可行?

假设我们的原始输入为 x ,而我们期望网络学习到的理想的映射为 f(x) , 如果采用传统神经网络连接模式的正常连接结构的话,就需要直接从网络块的输入 x 拟合出来其映射 f(x) ,而如果采用残差块的模式,对于这个残差块本身而言,需要拟合出来的就不是 f(x),而只需要拟合出来残差映射 f(x)-x 就可以了。而残差映射的学习在现实中更容易实现和优化,这就是残差块能够解决问题的逻辑所在。
以下图为例进行解释。以下网络块要学习的映射是 H(x),如果直接用其输入 x 学习和训练出来对应的映射 H(x),这就是传统网络连接的做法。对于Resnet所使用的残差块而言,输入仍然是 x,输入也仍然是需要学习的映射 H(x),把输入 x 通过短连接(short connection)的方式,直接连接到输出,与残差块的输出 F(x) 相加,作为整个模块的输出 H(x),这样的话,对于残差块内部参数的学习的目标,就不再是直接从 x 到 H(x) 的映射,而是 x 到 F(x) 也就是 H(x)-x 的映射。而在神经网络中学习和优化残差而言,会比直接学习最终的映射要来得更加容易。
notion image
举个简单的例子。假设输入 x 为2.9,模型的期望输出 H(x) 为3.0,两者之间的差值为3.0-2.9=0.1。
当使用传统网络结构的普通块来进行以上的映射,其从输入到输出的误差的变化是以其期望输出的3.0来进行评估;而如果按照残差块来实现以上映射,对于残差块内部参数的训练而言,其要训练的目标是残差 F(x)=H(x)-x=0.1,也就是说这个网络块的训练误差的变化是以这个差值的0.1来进行评估。
由此可以发现,采用残差的方式,可以更加凸显出来模型训练过程中的误差变化,模型也就更加容易训练和收敛。

典型残差块的结构

在作者的论文中,作者提出了两种残差块的结构,如下图所示:
notion image
对于层数不是很多的网络,使用左侧的连续3x3卷积-relu-3x3卷积的方式构成基础的残差块。而对于大于50层的网络,考虑到训练的深度和时间,作者提出了右侧的这种bottleneck的设计方式,增加了1x1卷积降维后再升维的方式,在节省大量参数的同时,兼顾考虑了深层网络的性能和时间复杂度。

Resnet模型架构

Resnet有不同网络层数的版本,例如18层,34层,50层,101层,152层等。其中最常用的是50层的网络结构,即Resnet-50。
Resnet模型的整体架构,基本上可以分为三个部分:输入层,中间连续的残差块,以及最后的输出层。 其中,输入层和输出层对于Resnet的所有版本都是相同的,各个版本的区别主要就是中间连续的残差块的数量和结构。
ResNet的输入层,也就是其网络结构的前两层,跟CNN经典网络模型架构学习之GoogLeNet笔记所介绍的GoogLeNet中的一样: 输入图像首先进行7x7,步幅为2的卷积处理,,输出通道数为64的特征图,然后接步幅为2的的2x2最大池化层。
Resnet中间的残差块部分,就由连续相连的基本残差块组成。只不过,对于各个不同版本的Resnet模型而言,其所包含的残差块的配置和数量各有区别。
notion image
以Resnet34为例,残差块部分包含有:连续三个64通道3x3卷积残差块,连续四个128通道3x3卷积残差块,连续六个256通道3x3卷积残差块,以及连续三个512通道3x3卷积残差块。最终输出7x7x512的特征图给输出层部分。整个Resnet34模型的结构,共计1个7x7卷积层,32个3x3卷积层,以及一个全连接层,总共就是34个参数层。 下图为Resnet34模型的网络架构图:
notion image
残差块部分所输出的特征图,再继续经过全局平均池化层的处理,送入最后一层的1000个神经元的全连接层,配合Softmax激活函数实现对ImageNet数据集1000个识别类型的识别概率输出。

参考资料

YOLOv1模型网络架构解读CNN经典网络模型架构学习之GoogleNet
Loading...