resnet网络模型架构
ResNet 网络模型架构详解
一、基础概念与改进之处
ResNet(Residual Network,残差网络)旨在解决深层神经网络训练过程中遇到的退化问题。随着网络深度增加,传统CNN容易陷入梯度消失或爆炸等问题,导致性能不升反降。为此,ResNet引入了跳跃连接(skip connections),也称为恒等映射或捷径连接,使得前一层可以直接绕过某些中间层传递到后续层。
这种设计允许信息更顺畅地向前传播的同时,也为反向传播提供了额外路径,有助于缓解深层网络中的优化难题[^1]。
二、两种不同类型的残差模块
针对不同规模的ResNet版本,存在两种主要形式的残差块:
(一)基本残差块 (Basic Block)
适用于较浅层次的ResNet变体,比如ResNet-18 和 ResNet-34。该类残差单元由两个连续的标准卷积操作构成,每个都伴随批量标准化(Batch Normalization)和ReLU激活函数处理。如果输入特征图尺寸不变,则采用实线型跳接;反之则需利用1×1卷积调整通道数以匹配输出维度,形成虚线型跳接[^2]。
class BasicBlock(nn.Module):
expansion = 1
def __init__(self, in_planes, planes, stride=1):
super(BasicBlock, self).__init__()
self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)
self.bn1 = nn.BatchNorm2d(planes)
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=1, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(planes)
self.shortcut = nn.Sequential()
if stride != 1 or in_planes != self.expansion * planes:
self.shortcut = nn.Sequential(
nn.Conv2d(in_planes, self.expansion * planes, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(self.expansion * planes)
)
def forward(self, x):
out = F.relu(self.bn1(self.conv1(x)))
out = self.bn2(self.conv2(out))
out += self.shortcut(x)
out = F.relu(out)
return out
(二)瓶颈残差块 (Bottleneck Block)
专用于更深版本的ResNet实现方式,例如ResNet-50、ResNet-101以及ResNet-152。此类型残差组件包含了三个阶段性的子过程:首先是压缩空间维数至四分之一的小型1×1卷积核,接着执行常规大小的感受野扩展操作——即应用3×3滤波器进行局部感知计算,最后再经由另一个1×1卷积恢复原始的空间分辨率并扩大信道数目。同样地,在必要情况下会附加一条带有投影变换功能的旁支线路来确保加法运算两端的数据兼容性。
class Bottleneck(nn.Module):
expansion = 4
def __init__(self, in_planes, planes, stride=1):
super(Bottleneck, self).__init__()
self.conv1 = nn.Conv2d(in_planes, planes, kernel_size=1, bias=False)
self.bn1 = nn.BatchNorm2d(planes)
self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(planes)
self.conv3 = nn.Conv2d(planes, self.expansion * planes, kernel_size=1, bias=False)
self.bn3 = nn.BatchNorm2d(self.expansion * planes)
self.shortcut = nn.Sequential()
if stride != 1 or in_planes != self.expansion * planes:
self.shortcut = nn.Sequential(
nn.Conv2d(in_planes, self.expansion * planes, kernel_size=1, stride=stride, bias=False),
nn.BatchNorm2d(self.expansion * planes)
)
def forward(self, x):
out = F.relu(self.bn1(self.conv1(x)))
out = F.relu(self.bn2(self.conv2(out)))
out = self.bn3(self.conv3(out))
out += self.shortcut(x)
out = F.relu(out)
return out
三、整体结构特点
除了上述提到的核心组成部分外,完整的ResNet框架还包括以下几个显著特性:
初始层:通常由7x7的大尺度卷积加上最大池化(Max Pooling)组成,负责初步提取图像边缘轮廓等低级视觉特征。
**全局平均池化(Global Average Pooling)**:替代传统的全连接层作为分类之前的最终汇总手段,不仅减少了参数量还增强了泛化能力。
动态调整宽度策略:每当特征图的高度宽幅减半时,相应的通道数量便会加倍,以此维持相对稳定的计算成本与表达力平衡关系。
相关推荐


















