当前位置: 首页 > news >正文

resnet的模型结构和block是什么样的,怎么对应到代码中的网络搭建

ResNet(Residual Network)的核心思想其实就一句话:通过“残差连接(skip connection)解决深层网络训练困难问题。但你问的是“结构 + block + 如何映射到代码”,我们直接从结构 → block → 代码实现一层层拆开讲清楚。


一、ResNet整体结构(以 ResNet-50 为例)

一个标准 ResNet 可以抽象为:

输入 ↓ Conv1(7x7 + BN + ReLU + MaxPool) ↓ Stage1(多个残差块) ↓ Stage2(多个残差块) ↓ Stage3(多个残差块) ↓ Stage4(多个残差块) ↓ Global AvgPool ↓ FC ↓ 输出

👉 核心:中间全是“残差块(Residual Block)堆叠”


二、Residual Block(残差块)本质

残差块核心公式:

[
y = F(x) + x
]

👉 含义:

  • x:输入
  • F(x):卷积网络学到的“残差”
  • 输出 = 输入 + 学到的变化

1️⃣ BasicBlock(用于 ResNet18 / 34)

结构:

x │ ├── Conv3x3 → BN → ReLU │ ├── Conv3x3 → BN │ └── +(identity) ↓ ReLU

👉 特点:

  • 2层卷积
  • 输入输出通道一致

2️⃣ Bottleneck(用于 ResNet50/101/152)

结构:

x │ ├── 1x1 Conv(降维) ├── 3x3 Conv(特征提取) ├── 1x1 Conv(升维) │ └── + identity ↓ ReLU

👉 通道变化:

in_channels → mid → mid → out_channels

👉 一般关系:

out_channels = 4 * mid_channels

三、关键问题:尺寸不一致怎么办?

如果:

  • stride ≠ 1
  • 或 通道数不同

👉 就不能直接x + F(x)

需要一个downsample(捷径分支)

identity = Conv1x1(x)

四、代码如何对应(PyTorch)

我们直接给你一个标准可复用写法


1️⃣ BasicBlock实现

importtorchimporttorch.nnasnnclassBasicBlock(nn.Module):expansion=1# 输出通道倍数def__init__(self,in_channels,out_channels,stride=1):super().__init__()self.conv1=nn.Conv2d(in_channels,out_channels,3,stride,1,bias=False)self.bn1=nn.BatchNorm2d(out_channels)self.relu=nn.ReLU(inplace=True)self.conv2=nn.Conv2d(out_channels,out_channels,3,1,1,bias=False)self.bn2=nn.BatchNorm2d(out_channels)# shortcutself.downsample=Noneifstride!=1orin_channels!=out_channels:self.downsample=nn.Sequential(nn.Conv2d(in_channels,out_channels,1,stride,bias=False),nn.BatchNorm2d(out_channels))defforward(self,x):identity=x out=self.conv1(x)out=self.bn1(out)out=self.relu(out)out=self.conv2(out)out=self.bn2(out)ifself.downsample:identity=self.downsample(x)out+=identity out=self.relu(out)returnout

2️⃣ Bottleneck实现(ResNet50核心)

classBottleneck(nn.Module):expansion=4def__init__(self,in_channels,mid_channels,stride=1):super().__init__()out_channels=mid_channels*4self.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,1,bias=False)self.bn2=nn.BatchNorm2d(mid_channels)self.conv3=nn.Conv2d(mid_channels,out_channels,1,bias=False)self.bn3=nn.BatchNorm2d(out_channels)self.relu=nn.ReLU(inplace=True)self.downsample=Noneifstride!=1orin_channels!=out_channels:self.downsample=nn.Sequential(nn.Conv2d(in_channels,out_channels,1,stride,bias=False),nn.BatchNorm2d(out_channels))defforward(self,x):identity=x out=self.relu(self.bn1(self.conv1(x)))out=self.relu(self.bn2(self.conv2(out)))out=self.bn3(self.conv3(out))ifself.downsample:identity=self.downsample(x)out+=identity out=self.relu(out)returnout

3️⃣ ResNet主干如何搭

关键函数:make_layer

defmake_layer(block,in_channels,out_channels,blocks,stride):layers=[]# 第一个block可能需要降采样layers.append(block(in_channels,out_channels,stride))for_inrange(1,blocks):layers.append(block(out_channels*block.expansion,out_channels))returnnn.Sequential(*layers)

4️⃣ ResNet50结构对应

self.layer1=make_layer(Bottleneck,64,64,3,stride=1)self.layer2=make_layer(Bottleneck,256,128,4,stride=2)self.layer3=make_layer(Bottleneck,512,256,6,stride=2)self.layer4=make_layer(Bottleneck,1024,512,3,stride=2)

👉 对应论文:

StageBlock数
layer13
layer24
layer36
layer43

五、你需要建立的“映射思维”

看到代码要能脑补结构:

1️⃣block.expansion

👉 决定输出通道是否 ×4


2️⃣stride

👉 控制:

  • 是否降采样
  • feature map 是否变小

3️⃣downsample

👉 控制:

  • shortcut 是否变形

4️⃣make_layer

👉 本质就是:

多个 block 堆叠

六、一句话总结(非常关键)

👉 ResNet代码 =

block定义(结构) + make_layer(堆叠规则) + 主干拼接

http://www.jsqmd.com/news/638588/

相关文章:

  • Terraform State 管理:本地与远程后端
  • 《神泣:纷争》手游官网公测预约开启,光与怒的指尖史诗,十年情怀热血重燃!
  • P2H-Python字符串格式化完全指南-format和f-string的Python编程利器
  • 团队协同+合规安全!2026 Agent智能体平台推荐排行 企业团队优选版
  • 终极解锁:AMD Ryzen处理器SMU调试工具完全指南
  • WandEnhancer终极指南:5分钟解锁WeMod完整功能
  • granite-4.0-h-350m效果展示:Ollama本地运行下韩语/葡萄牙语指令响应
  • 2026届毕业生推荐的五大降重复率神器实测分析
  • DeepSeek总结的 DuckDB 1.5.2发版说明
  • ERTEC 系列 PROFINET 芯片级硬件过滤器分析喂
  • S2-Pro生成技术架构图描述:对比PlantUML与Mermaid输出效果
  • 终极指南:3步掌握安卓虚拟定位技术,FakeLocation实现应用级位置隔离
  • Rust高性能编程:Yi-Coder-1.5B所有权模型解析
  • 多模态AI轻松上手:Qwen3-VL-WEBUI部署使用一条龙指南
  • BepInEx终极教程:5分钟学会Unity游戏插件框架安装与使用
  • Qwen-Image-2512-Pixel-Art-LoRA 模型v1.0 多模型对比:与Stable Diffusion在像素艺术生成上的差异分析
  • Pixel Aurora Engine 助力大模型技术科普:生成Transformer架构详解图
  • 2026年4月评价好的抗震支架厂家推荐,热浸锌桥架/空气型母线槽/托盘式桥架/防火桥架/模压桥架,抗震支架公司哪家可靠 - 品牌推荐师
  • AI Agent方向简历项目数量多少合适
  • 千问3.5-2B智能运维助手:自动化日志分析与故障排查
  • 基于Python的企业内部小型网络管理系统
  • 高性能计算加速:利用.accelerate库在PyTorch 2.8 中实现分布式训练
  • Switch游戏文件传输终极指南:NS-USBLoader完整使用教程
  • CRC校验:Modbus数据帧的“指纹”
  • 2026年Java面试题最新整理,附白话答案
  • flux + kubernetes + gitops + Kustomization
  • 基于Python的动漫商城管理系统毕设
  • intv_ai_mk11多任务能力:支持多轮上下文记忆,连续追问‘第2点’自动关联前文
  • PyTorch 2.8镜像快速上手:5分钟验证torch.compile+SDPA加速效果
  • 音视频处理框架