各版本ResNet变体通道数解析

📊 各版本ResNet通道数对比表

模型变体 Layer1 Layer2 Layer3 Layer4 总参数量
基础残差块系列
ResNet18 64 128 256 512 11.7M
ResNet34 64 128 256 512 21.8M
瓶颈块系列
ResNet50 256 512 1024 2048 25.6M
ResNet101 256 512 1024 2048 44.5M
ResNet152 256 512 1024 2048 60.2M

浅层:通道少,空间大 → 细节信息

深层:通道多,空间小 → 语义信息

🔬 各版本ResNet详细通道数

ResNet18

结构:8个基础残差块

输入 (3, H, W)

Conv1 (64, H/2, W/2) # 7x7, stride=2

MaxPool (64, H/4, W/4) # 3x3, stride=2

Layer1: [64 → 64] × 2 # 2个残差块,通道数不变

Layer2: [64 → 128] × 2 # 2个残差块,通道数翻倍

Layer3: [128 → 256] × 2 # 2个残差块,通道数翻倍

Layer4: [256 → 512] × 2 # 2个残差块,通道数翻倍

输出通道数 :[64, 128, 256, 512]

ResNet34

结构:16个基础残差块

输入 (3, H, W)

Conv1 (64, H/2, W/2)

MaxPool (64, H/4, W/4)

Layer1: [64 → 64] × 3 # 3个残差块

Layer2: [64 → 128] × 4 # 4个残差块

Layer3: [128 → 256] × 6 # 6个残差块

Layer4: [256 → 512] × 3 # 3个残差块

输出通道数 :[64, 128, 256, 512]

ResNet50

结构:16个瓶颈块

输入 (3, H, W)

Conv1 (64, H/2, W/2)

MaxPool (64, H/4, W/4)

Layer1: [64 → 64 → 256] × 3 # 瓶颈块:64→64(3x3)→256

Layer2: [256 → 128 → 512] × 4 # 256→128(3x3)→512

Layer3: [512 → 256 → 1024] × 6 # 512→256(3x3)→1024

Layer4: [1024 → 512 → 2048] × 3 # 1024→512(3x3)→2048

输出通道数 :[256, 512, 1024, 2048]

ResNet101

结构:33个瓶颈块

输入 (3, H, W)

Conv1 (64, H/2, W/2)

MaxPool (64, H/4, W/4)

Layer1: [64 → 64 → 256] × 3 # 3个瓶颈块

Layer2: [256 → 128 → 512] × 4 # 4个瓶颈块

Layer3: [512 → 256 → 1024] × 23 # 23个瓶颈块 ⭐

Layer4: [1024 → 512 → 2048] × 3 # 3个瓶颈块

输出通道数 :[256, 512, 1024, 2048]

ResNet152

结构:50个瓶颈块

输入 (3, H, W)

Conv1 (64, H/2, W/2)

MaxPool (64, H/4, W/4)

Layer1: [64 → 64 → 256] × 3 # 3个瓶颈块

Layer2: [256 → 128 → 512] × 8 # 8个瓶颈块

Layer3: [512 → 256 → 1024] × 36 # 36个瓶颈块 ⭐

Layer4: [1024 → 512 → 2048] × 3 # 3个瓶颈块

输出通道数 :[256, 512, 1024, 2048]

📏 各层级特征图详细尺寸表

经典ResNet (18/34/50/101/152)

层级 输入尺寸 输出尺寸 下采样倍数 相对输入比例
Conv1 224×224 112×112 2 1/2
MaxPool 112×112 56×56 4 1/4
Layer1 56×56 56×56 4 1/4
Layer2 56×56 28×28 8 1/8
Layer3 28×28 14×14 16 1/16
Layer4 14×14 7×7 32 1/32

对于ResNet,由于采用了大量的步长为2的卷积和池化,特征图尺寸呈现规律性的减半

🎨 代码模板:ResNet特征提取器

python 复制代码
import torch
import torch.nn as nn
import torchvision.models as models

class ResNetFeatureExtractor(nn.Module):
    def __init__(self, backbone_name='resnet34', pretrained=True):
        super().__init__()
        
        # 获取预训练模型
        self.backbone = self._get_backbone(backbone_name, pretrained)
        
        # 根据backbone类型设置输出通道数
        self.output_channels = self._get_output_channels(backbone_name)
        
        # 拆解网络
        self._build_feature_extractor()
        
    def _get_backbone(self, name, pretrained):
        weights = 'IMAGENET1K_V1' if pretrained else None
        if name == 'resnet18':
            return models.resnet18(weights=weights)
        elif name == 'resnet34':
            return models.resnet34(weights=weights)
        elif name == 'resnet50':
            return models.resnet50(weights=weights)
            
    def _get_output_channels(self, name):
        # 返回各阶段的输出通道数
        channels_dict = {
            'resnet18': [64, 128, 256, 512],
            'resnet34': [64, 128, 256, 512],
            'resnet50': [256, 512, 1024, 2048],
        }
        return channels_dict.get(name, [])
    
    def _build_feature_extractor(self):
        # 提取各层
        self.conv1 = self.backbone.conv1
        self.bn1 = self.backbone.bn1
        self.relu = self.backbone.relu
        self.maxpool = self.backbone.maxpool
        self.layer1 = self.backbone.layer1
        self.layer2 = self.backbone.layer2
        self.layer3 = self.backbone.layer3
        self.layer4 = self.backbone.layer4
        
    def forward(self, x):
        # 逐层前向传播
        x = self.conv1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.maxpool(x)
        
        c1 = self.layer1(x)   # 1/4分辨率
        c2 = self.layer2(c1)  # 1/8分辨率
        c3 = self.layer3(c2)  # 1/16分辨率
        c4 = self.layer4(c3)  # 1/32分辨率
        
        return {
            'c1': c1,  # 浅层特征
            'c2': c2,  # 中層特征
            'c3': c3,  # 深层特征
            'c4': c4,  # 最深层特征
        }

# 使用示例
extractor = ResNetFeatureExtractor('resnet50')
x = torch.randn(1, 3, 224, 224)
features = extractor(x)

for name, feat in features.items():
    print(f"{name}: {feat.shape}")
# 输出:
# c1: torch.Size([1, 256, 56, 56])
# c2: torch.Size([1, 512, 28, 28]) 
# c3: torch.Size([1, 1024, 14, 14])
# c4: torch.Size([1, 2048, 7, 7])

🚀 实践中的选择策略

何时使用哪一层特征?

任务类型 推荐使用的特征层 原因
小目标检测 Layer2 (1/8) 保留更多空间细节
大目标检测 Layer4 (1/32) 语义信息丰富
实例分割 Layer2 + Layer3 平衡细节和语义
图像分类 Layer4 只需高层语义

📌 选择建议

初学者/快速实验:ResNet18 或 ResNet34

工业级应用:ResNet50 或 ResNeXt50

竞赛/高精度:ResNet101 或 ResNeXt101

超大模型:Wide ResNet系列

移动端部署:ResNet18(可考虑量化)

理解这些通道数设计,能帮助你更好地选择和调整backbone,为下游任务提供最合适的特征表示。

相关推荐
一线数智几秒前
AI+业务 Vs 业务+AI?寻找让AI真正“转”起来的确定性答案
大数据·人工智能
XMAIPC_Robot1 分钟前
RK3588 PLC AMP 核隔离配置 + RT‑Thread 实时优化 + FPGA 接口定义 + CODESYS 工程
人工智能·嵌入式硬件·深度学习·fpga开发
happyness443 分钟前
2026 主流 AI 编码全景对比表
人工智能·ai编程
智慧医养结合软件开源4 分钟前
数智协同,赋能康养服务高效升级
大数据·人工智能·云计算·生活
SEO_juper5 分钟前
行业白皮书 GEO 化转 HTML + 结构化,AI 引用率提升 50%
人工智能·chatgpt·seo·白皮书·独立站·外贸电商·谷歌geo
萤萤七悬9 分钟前
【AI精彩BUG汇总】一、yolo图像训练截图蓝色变橙色
人工智能·yolo·bug
思维新观察10 分钟前
从 AI 工具到音乐生态:可酷加速布局,构建数字音乐全新基础设施
人工智能
Miss roro11 分钟前
法律文书信息自动提取:OCR识别与AI技术在案件管理中的应用
人工智能·ocr·法律科技·律所管理系统·案件管理系统
乐迪信息15 分钟前
乐迪信息:港口夜间船舶巡查难,AI摄像机法全天候监测
人工智能·物联网·算法·计算机视觉·目标跟踪
sali-tec16 分钟前
C# 基于OpenCv的视觉工作流-章74-线-线距离
图像处理·人工智能·opencv·算法·计算机视觉