详解YOLOv5中的Bottleneck

本文详细介绍了残差网络中的Bottleneck结构及其在YOLOv5中的应用。对比了Bottleneck与Buildingblock的区别,并深入分析了YOLOv5中Bottleneck的结构变化及代码实现。

深度学习入门小菜鸟,希望像做笔记记录自己学的东西,也希望能帮助到同样入门的人,更希望大佬们帮忙纠错啦~侵权立删。

目录

一、背景知识 -- 残差结构

二、Bottleneck和building block

三、YOLOv5中的Bottleneck

1、结构分析

2.代码分析(内含注释分析)


一、背景知识 -- 残差结构

关于残差以及一些残差网络(eg: Resnet)的分析,可以看一下博主之前写的博客

深度学习之Resnet详解_tt丫的博客-优快云博客


二、Bottleneck和building block

说到Bottleneck,就会想到他的“兄弟” -- building block。Bottleneck和building block其实都是在Resnet中提出的。如下图所示,左边是针对Resnet34提出的building block;右边是针对Resnet50提出的Bottleneck。

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAdHTkuKs=,size_20,color_FFFFFF,t_70,g_se,x_16

  building block由两个3*3的卷积层组成,Bottleneck由两个1*1卷积层夹心一个3*3卷积层组成:其中1*1卷积层负责减少然后增加(实际上就是恢复)维数,让3*3卷积层成为输入/输出维数更小的瓶颈。Bottleneck既减少了参数量,又优化了计算,保持了原有的精度。

第一个1*1的卷积把256维channel降到64维,最后再通过

深度学习中,**Bottleneck** 架构是一种优化模型结构、提升计算效率的重要设计模式,尤其在ResNet(残余网络)中得到了广泛应用。这种结构通过减少中间层的参数数量和计算量,在保证模型性能的同时显著降低了资源消耗。 ### Bottleneck 结构的设计原理 Bottleneck 模块通常由三个卷积层组成:一个 1×1 卷积用于降维,接着是一个 3×3 卷积用于提取空间特征,最后再通过一个 1×1 卷积恢复维度。这种“压缩-处理-扩展”的方式有效减少了计算冗余,同时保留了网络的表达能力。例如,在 ResNet-50 中,每个 Bottleneck 块的输入通道数通常被压缩到原始维度的 1/4,从而显著减少了参数数量和计算复杂度[^1]。 ### Bottleneck 在模型优化中的作用 通过引入 Bottleneck 结构,深度神经网络可以在保持较高准确率的同时显著降低计算成本。例如,ResNet-50 相较于 ResNet-18 在深度增加的情况下,其参数数量并未显著上升,这主要归功于 Bottleneck 的设计优化了每一层的特征提取效率。此外,Bottleneck 还有助于缓解梯度消失问题,使得深层网络的训练更加稳定和高效[^1]。 ### Bottleneck 与信息瓶颈原理的关系 虽然 Bottleneck 结构主要应用于网络架构优化,但其设计理念与信息瓶颈(Information Bottleneck, IB)原理在理论上存在一定的联系。信息瓶颈理论强调在学习过程中保留任务相关的信息,同时压缩冗余信息,以提高表示的效率和泛化能力。类似地,Bottleneck 模块通过压缩通道数减少冗余信息的传播,从而让网络更专注于关键特征的学习[^2]。 ### 示例代码:ResNet 中的 Bottleneck 模块 以下是一个基于 PyTorch 实现的 Bottleneck 模块示例: ```python import torch.nn as nn class Bottleneck(nn.Module): expansion = 4 # 输出通道是输入通道的4倍 def __init__(self, in_channels, out_channels, stride=1, downsample=None): super(Bottleneck, self).__init__() self.conv1 = nn.Conv2d(in_channels, out_channels, kernel_size=1, bias=False) self.bn1 = nn.BatchNorm2d(out_channels) self.conv2 = nn.Conv2d(out_channels, out_channels, kernel_size=3, stride=stride, padding=1, bias=False) self.bn2 = nn.BatchNorm2d(out_channels) self.conv3 = nn.Conv2d(out_channels, out_channels * self.expansion, kernel_size=1, bias=False) self.bn3 = nn.BatchNorm2d(out_channels * self.expansion) self.relu = nn.ReLU(inplace=True) self.downsample = downsample self.stride = stride def forward(self, x): identity = x out = self.conv1(x) out = self.bn1(out) out = self.relu(out) out = self.conv2(out) out = self.bn2(out) out = self.relu(out) out = self.conv3(out) out = self.bn3(out) if self.downsample is not None: identity = self.downsample(x) out += identity out = self.relu(out) return out ``` 该模块通过 1×1 卷积压缩通道数,再使用 3×3 卷积提取特征,最后通过 1×1 卷积恢复通道数,实现了高效的特征表达与计算优化。 ---
评论 13
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

tt丫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值