1. ResNet-152结构总览
ResNet-152 是2015年He Kaiming等人提出的ResNet家族中网络层数最多,性能最强大的版本之一,其深度为152层,核心创新是采用了瓶颈残差块(Bottleneck Block),堆叠层数极深但易于优化。ResNet-152广泛用于图像识别、检测等各类CV任务中,经常作为大型数据集如ImageNet的主力骨干网络。
2. 整体网络结构
以ImageNet输入(224×224 RGB图片)为例,ResNet-152结构如下:
Input: 224×224×3
1. conv1: 7×7卷积, 64通道, 步长2, padding=3
2. maxpool: 3×3, 步长2
==== Stage1 ====
3. layer1: 64 → 256通道,堆叠3个Bottleneck Block
==== Stage2 ====
4. layer2: 256 → 512通道,堆叠8个Bottleneck Block
==== Stage3 ====
5. layer3: 512 → 1024通道,堆叠36个Bottleneck Block
==== Stage4 ====
6. layer4: 1024 → 2048通道,堆叠3个Bottleneck Block
7. global average pooling
8. fully connected layer(1000分类)
输出:1000维分类结果(ImageNet)
3. 各阶段Bottleneck Block结构
每个Bottleneck Block由三层卷积组成:
- 1×1卷积:降维,减少通道数
- 3×3卷积:主要的计算
- 1×1卷积:升维,恢复通道数
- 残差连接:输入直接跳跃到输出(必要时用1×1卷积匹配shape)
典型以layer2中的Bottleneck(输入256通道为例)为例:
每个Bottleneck Block视为3层,整网有:
$(3+8+36+3)×3+2(conv1 + fc)=152(3+8+36+3)×3+2(conv1 + fc)=152$
其中每个stage的block层数乘以3,conv1和fc各1层。
4. 各阶段详细参数分布
| conv1 | 112×112 | 1 | 7×7, 64, stride 2 | 3→64 |
| maxpool | 56×56 | 1 | 3×3, stride 2 | 64 |
| layer1 | 56×56 | 3 | 1×1,64→64; 3×3,64; 1×1,256 | 64→256 |
| layer2 | 28×28 | 8 | 1×1,256→128; 3×3,128; 1×1,512 | 256→512 |
| layer3 | 14×14 | 36 | 1×1,512→256; 3×3,256; 1×1,1024 | 512→1024 |
| layer4 | 7×7 | 3 | 1×1,1024→512; 3×3,512; 1×1,2048 | 1024→2048 |
| avgpool | 1×1 | 1 | Global average pooling | 2048 |
| fc | 1×1 | 1 | 输出1000类 | 2048→1000 |
5. 结构图示意
Input
↓
[conv1] → [maxpool]
↓
[layer1: 3 × bottleneck]
↓
[layer2: 8 × bottleneck]
↓
[layer3: 36 × bottleneck]
↓
[layer4: 3 × bottleneck]
↓
[avgpool] → [fc]
↓
Output
6. PyTorch伪代码框架
import torch.nn as nn
class Bottleneck(nn.Module):
expansion = 4 # 输出通道数通常是输入的4倍
def __init__(self, in_channels, mid_channels, stride=1, downsample=None):
super(Bottleneck, self).__init__()
self.conv1 = nn.Conv2d(in_channels, mid_channels, 1, bias=False)
self.bn1 = nn.BatchNorm2d(mid_channels)
self.conv2 = nn.Conv2d(mid_channels, mid_channels, 3, stride=stride, padding=1, bias=False)
self.bn2 = nn.BatchNorm2d(mid_channels)
self.conv3 = nn.Conv2d(mid_channels, mid_channels * self.expansion, 1, bias=False)
self.bn3 = nn.BatchNorm2d(mid_channels * self.expansion)
self.relu = nn.ReLU(inplace=True)
self.downsample = downsample
def forward(self, x):
identity = x if self.downsample is None else self.downsample(x)
out = self.relu(self.bn1(self.conv1(x)))
out = self.relu(self.bn2(self.conv2(out)))
out = self.bn3(self.conv3(out))
out += identity
out = self.relu(out)
return out
7. ResNet-152在工业界/科研中的常用场景
- 大规模图像分类任务
- 作为深度学习任务(检测、分割等)的骨干特征提取网络
- 迁移学习,作为预训练模型在医学影像、卫星图像等高难领域微调
- 常作为benchmark与其他模型公平对比
8. 主要特点及优势
- 极深(152层)但易于训练,归功于残差结构
- 性能强大,ImageNet Top1准确率约77.8%
- 支持更复杂更细致的特征学习
- 预训练权重广泛可用
9. 局限性
- 计算量大,对显存/算力要求高
- 训练/推理速度慢于ResNet-50等
10. ResNet-152 残差块参数详解
ResNet-152的核心是“Bottleneck Block”,以 layer3 的一个 block 为例说明参数分布和数据流:
假设输入通道数为 512,输出通道数为 2048(expansion=4)。
- 第一层 1×1卷积(降维):
输入 512 通道 → 输出 512 通道
参数数量:1×1×512×512=262,1441×1×512×512=262,144 - 第二层 3×3卷积(处理特征):
输入 512 通道 → 输出 512 通道
参数数量:3×3×512×512=2,359,2963×3×512×512=2,359,296 - 第三层 1×1卷积(升维):
输入 512 通道 → 输出 2048 通道
参数数量:1×1×512×2048=1,048,5761×1×512×2048=1,048,576 - 下采样分支(如果 stride > 1 或通道数不同):1×1卷积进行升/降维匹配。
每个 block 还会配合 BatchNorm、ReLU。
典型 Bottleneck block 总参数约在 3-4 百万。
其中 layer3 共36个 block,参数量极大。而整个ResNet152参数量大约为 60M(六千万)。
11. 残差连接的优势再解释
- 允许网络“跳过”部分层,若某些层无用,残差连接可让梯度直接流过;这使得即使层数极深依然可训练。
- 遇到梯度消失问题时,梯度可通过shortcut流向浅层。
- 提高身份映射能力,让深层网络可拟合更复杂关系,但也可以方便地退化为低层。
12. ResNet-152 的训练技巧
- 权重预处理因网络深度,建议用He初始化+BN
- 数据增强:常用较强的数据增强,例如random crop、flip、color jitter等
- 优化器:SGD + momentum(如0.9)、weight decay(如1e-4)
- 学习率策略:step decay或cosine decay
- 梯度累积/混合精度:如果显存不足可使用梯度累积或AMP
- batch size:推荐较大(如32/64),可提升收敛性和泛化
13. 消融实验 及性能对比
论文以及后续研究中,典型消融实验如下:
- 无残差连接的极深网络:深层时准确率下降、训练损失上升
- 有残差连接:可持续增长精度,152层训练与34层几乎一致
- 残差块类型对比:Bottleneck结构可控参数量,性能更优
- 层数变化:ResNet-18/34/50/101/152准确率递增但参数和计算也递增
部分准确率(Top-1 ImageNet):
| ResNet-50 | ~76.0 | ~93.0 | 25.6M |
| ResNet-101 | ~77.0 | ~93.7 | 44.6M |
| ResNet-152 | ~77.8 | ~94.1 | 60.2M |
- 可以看出ResNet-152比ResNet-50/101略优,但参数翻倍,训练推理慢。
14. 迁移学习与实际场景应用
- 常用做ImageNet预训练骨干,迁移到分割、检测、医学影像、遥感、图像检索等多领域
- 在深度人脸识别、大规模场景分类等精度需求高场景广泛应用
- 通过微调(fine-tune),ResNet-152可有效适应小数据集或特殊领域
15. 代码调用(预训练模型)
在PyTorch中,直接这样调用预训练模型:
import torchvision.models as models
resnet152 = models.resnet152(pretrained=True)
out = resnet152(input_image) # input_image: [batch, 3, 224, 224]
如需冻结骨干或提取特征:
features = resnet152.conv1(input)
for layer in [resnet152.layer1, resnet152.layer2, resnet152.layer3, resnet152.layer4]:
features = layer(features)
16. 注意事项与优化建议
- 推理速度慢:可用ResNet-50做高效率版本
- 显存压力大:推荐16GB以上显卡
- 可剪枝、量化、蒸馏:若部署在实际应用可进一步优化模型规模
17. 相关经典论文
- He Kaiming, et al, “Deep Residual Learning for Image Recognition”, CVPR2016 (ResNet原文)
- He Kaiming, et al, “Identity Mappings in Deep Residual Networks”, ECCV2016 (pre-activation方案)
18. 总结
ResNet-152是极深卷积网络的典型代表,其残差结构保证了超深网络的可训练性和泛化性能,是深度视觉领域基础网络之一。
ResNet-152作为ResNet家族的“超级深”代表,通过残差连接和瓶颈结构,既保证了强大特征提取能力又可以稳定训练,是大规模视觉任务中的经典“骨干网络”
网硕互联帮助中心





评论前必须登录!
注册