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

【YOLOv5/v7改进系列】替换激活函数为SiLU、ReLU、LeakyReLU、FReLU、PReLU、Hardswish、Mish、ELU等

一、导言

激活函数在目标检测中的作用至关重要,它们主要服务于以下几个关键目的:

  1. 引入非线性:神经网络的基本构建块(如卷积层、全连接层等)本质上是线性变换,而激活函数通过引入非线性,使得网络能够学习和表达更复杂、更丰富的数据特征。这对于目标检测任务尤为重要,因为目标可能出现在图像中的任何位置、大小和姿态,且彼此之间可能有重叠或遮挡,非线性表达能力可以帮助模型更好地理解和区分这些复杂的场景。

  2. 控制梯度流:激活函数的形状影响着反向传播过程中的梯度传递,这对于权重更新和学习过程至关重要。例如,ReLU及其变体(如Leaky ReLU、PReLU、FReLU等)通过在负值区域保持非零斜率,解决了传统ReLU可能导致的“神经元死亡”问题,从而促进了深层网络中的梯度流动。

  3. 增强模型表达能力:特定的激活函数能够提升模型在特定任务上的表现。例如,FReLU(Funnel Activation Function)通过在激活阶段整合空间信息,提高了模型的空间理解能力,这对于目标检测这种需要精确定位的任务非常有利。

  4. 影响计算效率:不同的激活函数具有不同的计算复杂度。在实时目标检测系统如YOLO系列中,选择计算成本低且效果好的激活函数(如ReLU)对于保证模型的运行速度和资源效率是必要的。

  5. 输出范围调整:某些激活函数(如Sigmoid和Softmax)能够将输出限制在特定范围内,这在输出层特别有用,比如将网络输出转化为概率值,便于进行目标类别预测。

综上所述,激活函数不仅决定了神经网络的学习能力,还在很大程度上影响了目标检测模型的精度、训练效率以及最终的检测性能。因此,在设计目标检测网络时,精心选择和设计激活函数是一个重要环节。

二、YOLO训练中常见且有效的激活函数
  1. SiLU (Sigmoid Linear Unit): 也称为Swish,是一种自适应激活函数。SiLU尝试结合了线性变换和sigmoid函数的优点,能够提升模型的非线性表达能力,同时缓解梯度消失问题。

  2. ReLU (Rectified Linear Unit): 是最常用的激活函数之一,当输入为正时,输出等于输入;为负时,输出为0。ReLU解决了sigmoid和tanh函数的梯度饱和问题,加速了神经网络的训练,但在负值区域梯度为0,可能导致“死亡ReLU”现象。

  3. Leaky ReLU: 为了解决ReLU在负值区域梯度消失的问题而提出,即使负输入时函数也有非零斜率,帮助梯度流动。

  4. FReLU (Fractional ReLU): 是ReLU的一个变种,它引入了一个可学习的参数来调整负输入部分的斜率,提供了比Leaky ReLU更灵活的调整能力。

  5. PReLU (Parametric ReLU): 类似于Leaky ReLU,适用于不同层可能需要不同负斜率的情况。

  6. Hardswish: 是MobileNetV3中引入的一种激活函数,试图模仿Swish但计算成本更低。它在移动端设备上表现高效且性能良好。

  7. Mish: 由D. Misra提出,Mish结合了自我门控的性质和ReLU的简单性,被发现能在多种任务上提高模型性能。

  8. ELU (Exponential Linear Unit): 目的是减少ReLU的偏差移位问题并加速学习过程。

  9. CELU (Continuously Differentiable Exponential Linear Unit): 是ELU的一个连续可微分版本,旨在保持ELU的优点同时确保所有点的导数存在,适合需要严格平滑性的应用。

  10. GELU (Gaussian Error Linear Unit): 形式较为复杂,与高斯分布的累积分布函数有关。GELU在Transformer等模型中表现优秀,因为它能更好地匹配神经网络中权重初始化的分布。

  11. SELU (Scaled Exponential Linear Unit): 设计用于自归一化神经网络,SELU旨在确保网络的输出具有零均值和单位方差,从而简化训练过程中的归一化需求。

需要注意的是,YOLOv7、YOLOv5项目采用的默认激活函数为SiLU,而YOLOv7-tiny项目采用的激活函数为LeakyReLU,ResNet系列采用的激活函数则为ReLU,选择何种激活函数为自己的Baseline需要先查阅相关论文再下判断,以此为改进的对照方可得出结果。

同时,YOLOv5/v7的激活函数一般在models/activations.py下

三、YOLOv7-tiny改进工作

了解二后,在YOLOv7项目文件下的models文件夹下的common.py,采用ctrl+F搜索如下代码。

self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())

将其替换为二的激活函数即可。

四、YOLOv7改进工作

了解二后,在YOLOv7项目文件下的models文件夹下的common.py,采用ctrl+F搜索如下代码。

self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())

将其替换为二的激活函数即可。

五、YOLOv5改进工作

了解二后,在YOLOv5项目文件下的models文件夹下的common.py,采用ctrl+F搜索如下代码。

self.act = nn.SiLU() if act is True else (act if isinstance(act, nn.Module) else nn.Identity())

将其替换为二的激活函数即可。

更多文章产出中,主打简洁和准确,欢迎关注我,共同探讨!

http://www.lryc.cn/news/352124.html

相关文章:

  • 修改MySQL root用户密码
  • 力扣刷题---409. 最长回文串【简单】
  • 百度智能云参与信通院多项边缘计算标准编制,「大模型时代下云边端协同 AI 发展研讨会」成功召开
  • 前后端联调
  • 根据配置的mode环境显示不同的index模板
  • hls.js实现分片播放视频
  • K8s 运维架构师实战课程
  • AIGC基础教学:AI+建筑设计,一场划时代变革的序幕已经拉开
  • 领域知识 | 智能驾驶安全领域部分常见概论
  • 力扣刷题---返回word中所有不重复的单词
  • 正点原子LWIP学习笔记(一)lwIP入门
  • 16、设计模式之迭代器模式
  • 自然语言处理实战项目29-深度上下文相关的词嵌入语言模型ELMo的搭建与NLP任务的实战
  • TCP/IP体系模型简介
  • 【ZYNQ】AXI-Quad-SPI SDK 开发记录 测试
  • Django提交表单出错提示错误
  • 鸿蒙开发 组件之间的传值
  • [晕事]今天做了件晕事35 VM发送给gateway太多ARP,导致攻击检查?
  • 虹科干货丨多设备协同无忧:Linux环境下PCAN固定设备ID通道分配指南
  • 【python】flask操作数据库工具SQLAlchemy,详细用法和应用实战
  • web前端项目已有阿里巴巴图标基础上,再次导入阿里巴巴图标的方法
  • 头歌openGauss-存储过程第2关:修改存储过程
  • ThreadLocal简单使用案例
  • 创建型设计模式之建造者模式
  • mainwindow 无菜单栏 可拖动,边界可扩大,动画浮现上边框
  • 机器学习云环境测试
  • 扩散模型自动管道AutoPipeline
  • Map六种遍历方式
  • 集合-1 数组ArrayListLinkedList
  • 42-1 应急响应之账户排查