news 2026/4/23 15:57:29

YOLOv5-C3模块——学习记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
YOLOv5-C3模块——学习记录

声明

  • 🍨本文为🔗365天深度学习训练营中的学习记录博客
  • 🍖原作者:K同学啊

我的环境

Python版本:3.10.19
PyTorch版本:2.9.1+cu130
Torchvision版本:0.24.1+cu130
CUDA版本:13.0
GPU设备:NVIDIA GeForce RTX 5060


主要内容

YOLOv5中的C3模块

代码解析

首先,定义了一个新卷积Conv,它是由一个卷积层、一个池化层以及一个SiLU层组成

#卷积块:卷积+批归一化+激活函数 class Conv(nn.Module): def __init__(self, c1, c2, k=1, s=1, p=None, g=1, act=True): super().__init__() self.conv = nn.Conv2d(c1, c2, k, s, atuopad(k, p), groups=g, bias=False) self.bn = nn.BatchNorm2d(c2) #act = true时使用SiLU激活函数,act为false时不使用激活函数,act也可以传入自定义的激活函数 self.act = nn.SiLU() if act else (act if isinstance(act, nn.Module) else nn.Identity()) def forward(self, x): return self.act(self.bn(self.conv(x)))

这其中用到了一个自动计算padding的函数,该函数目的是让输出的尺寸和输入保持一致

#通过改变padding实现输出尺寸不变 def atuopad(k, p=None): if p is None: p = k // 2 if isinstance(k, int) else [x // 2 for x in k] return p

接下来是Bottleneck层,Bottleneck层是现代深度卷积网络的核心组件,主要作用是在保持或提升性能的同时,显著降低计算复杂度和参数量;并且它使用残差链接保证了网络深度。

如图所示,一个bottleneck层是将输入以及输入经过两次conv层后的输出结合在一起作为输出。故代码如下

class Bottleneck(nn.Module): def __init__(self, c1, c2, shortcut=True, g=1, e=0.5): super().__init__() c_ = int(c2 * e) self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c_, c2, 3, 1, g=g) #是否使用残差连接,启用残差链接且输入输出通道数相等时使用 self.add = shortcut and c1 == c2 def forward(self, x): return x + self.cv2(self.cv1(x)) if self.add else self.cv2(self.cv1(x))

最后组成了其中的C3模块

在YOLOv5中,有许多C3模块连接在一起,组成了其中经典的C3*N结构

C3模块由输入先经过一个Conv层,然后加上通过N个bottleneck层的结果,最后再经过一个Conv层组成

class C3(nn.Module): def __init__(self, c1, c2, n=1, shortcut=True, g=1, e=0.5): super().__init__() c_ = int(c2 * e) self.cv1 = Conv(c1, c_, 1, 1) self.cv2 = Conv(c1, c_, 1, 1) self.cv3 = Conv(2 * c_, c2, 1) self.m = nn.Sequential(*[Bottleneck(c_, c_, shortcut, g, e=1.0) for _ in range(n)]) def forward(self, x): return self.cv3(torch.cat((self.m(self.cv1(x)), self.cv2(x)), dim=1))

最后网络结构如下

class model_K(nn.Module): def __init__(self): super(model_K, self).__init__() self.Conv = Conv(3, 32, 3, 2) self.C3_1 = C3(32, 64, 3, 2) self.classifier = nn.Sequential( nn.Linear(802816, 100), nn.ReLU(), nn.Linear(100, out_features=4) ) def forward(self, x): x = self.Conv(x) x = self.C3_1(x) x = torch.flatten(x, 1) x = self.classifier(x) return x

可自行选择,增加其中C3层数量,以及bottleneck层数量。但是注意修改线性层输入。


输出结果

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 12:34:18

LobeChat能否举办黑客松?激发创新应用场景

LobeChat:为何它天生适合成为黑客松的创新引擎? 在AI技术飞速落地的今天,一个值得深思的问题浮现出来:我们是否还需要从零开始构建每一个AI应用? 面对GPT、Llama、通义千问等大模型日益强大的能力,真正的…

作者头像 李华
网站建设 2026/4/23 5:52:25

LangFlow流编辑器深度解析:可视化编排核心机制

LangFlow流编辑器深度解析:可视化编排核心机制 在大模型应用开发日益普及的今天,如何快速构建、调试和迭代复杂的 LLM 工作流,成为开发者面临的核心挑战。传统方式依赖大量胶水代码连接组件——LLM、提示词模板、工具调用、向量存储……每一…

作者头像 李华
网站建设 2026/4/23 12:53:51

LobeChat能否对接SpaceX API?火箭发射追踪与科普问答

LobeChat能否对接SpaceX API?火箭发射追踪与科普问答 在智能对话系统日益普及的今天,用户不再满足于模型“凭记忆回答问题”——他们希望AI能像搜索引擎一样,实时获取最新信息。比如当有人问:“SpaceX最近一次发射成功了吗&#…

作者头像 李华
网站建设 2026/4/23 9:53:34

撞库攻击再现:第三位DraftKings黑客认罪揭示认证安全短板

第三位DraftKings黑客认罪 严重性:中等 类型:漏洞 一名黑客承认对梦幻体育和博彩平台DraftKings进行了撞库攻击。撞库攻击是指自动化地尝试使用从其他数据泄露事件中窃取的用户名-密码对来获取未经授权的访问。这种攻击方法利用了用户在多个网站重复使用…

作者头像 李华
网站建设 2026/4/23 0:07:57

自主代码分析器在OSS零日漏洞竞赛中击败所有人类团队

自主代码分析器在OSS零日漏洞竞赛中击败所有人类团队 严重性:严重 类型:漏洞 在近期一场开源软件(OSS)零日漏洞竞赛中,一款自主代码分析器在识别零日漏洞方面击败了所有人类团队。这一进展凸显了自动化漏洞发现能力的显…

作者头像 李华
网站建设 2026/4/23 11:19:35

Linux中go程序调用c++的re2库配置问题

当要进行CGO编译程序时,除了go语言的相关环境配置,还要注重c/c的配置管理,比如G的版本问题,re2库是否用的较新的C库Abseil等等 安装RE2库 如果是centos的话就需要安装re2-devel,或者直接git clone。 yum install re2-d…

作者头像 李华