各版本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,为下游任务提供最合适的特征表示。

相关推荐
教男朋友学大模型2 小时前
平衡AI自动化与人工干预
大数据·人工智能·自动化
hzwy232 小时前
【AI智能体】会玩电脑的AI智能体
人工智能
啊阿狸不会拉杆2 小时前
《计算机视觉:模型、学习和推理》第 7 章-复杂数据密度建模
人工智能·python·学习·算法·计算机视觉·t分布·复杂数据密度建模
Loo国昌2 小时前
【AI应用开发实战】00_StockPilotX技术博客专栏:从零构建生产级AI金融分析系统
人工智能·算法·语言模型·自然语言处理·金融·prompt
大模型任我行2 小时前
字节:LLM自演化规则强化思维链
人工智能·语言模型·自然语言处理·论文笔记
A小码哥2 小时前
三大模型深度对比:Zhipu GLM-5 vs MiniMax M2.5 vs Qwen3-Coder-Next
人工智能·llm
Katecat996632 小时前
基于CT影像的肾脏疾病检测与分类:肾囊肿、正常组织及Tas_Var变异识别实践
人工智能·数据挖掘
java1234_小锋2 小时前
嵌入模型与Chroma向量数据库 - 嵌入模型与向量数据库简介 - AI大模型应用开发必备知识
人工智能·向量数据库·chroma
南_山无梅落2 小时前
从LangChain到LangGraph:构建智能Agent的实战指南(一)——AI应用的“工具箱“
人工智能·langchain