YOLOv8改进 | 激活函数 | 十余种常见的激活函数一键替换【完整代码】

news2024/12/23 14:38:12

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转


💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡


专栏目录 :《YOLOv8改进有效涨点》专栏介绍 & 专栏目录 | 目前已有80+篇内容,内含各种Head检测头、损失函数Loss、Backbone、Neck、NMS等创新点改进——点击即可跳转


本文给大家介绍的是常见的十余种激活函数替换,因为每种激活函数都有一定的优势,因此我们可以在实验中尝试不同的激活函数进行实验。文章在介绍激活函数的主要原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。 

专栏地址YOLOv8改进——更新各种有效涨点方法——点击即可跳转 订阅专栏学习不迷路 

1. YOLO训练中常见激活函数介绍

激活函数是神经网络中的关键组件,它们引入非线性特性,使模型能够学习复杂的模式。以下是几个常用的激活函数的优缺点及公式,以表格形式呈现:

激活函数公式优点缺点
SiLU\text{SiLU}(x) = x \cdot \sigma(x)平滑非线性;在某些任务上比ReLU效果更好计算复杂度稍高
ReLU\text{ReLU}(x) = \max(0, x)计算简单;收敛速度快神经元死亡(Dead Neurons)问题
LeakyReLU\text{LeakyReLU}(x) = \max(0.01x, x)缓解神经元死亡问题输出不以零为中心
Hardswish\text{Hardswish}(x) = x \cdot \frac{\max(0, \min(x+3, 6))}{6}近似Swish但计算更高效相对于ReLU计算复杂度稍高
Mish\text{Mish}(x) = x \cdot \tanh(\ln(1 + e^x))平滑非线性;在某些任务上优于ReLU和Swish计算复杂度高;训练时间较长
ELU\text{ELU}(x) = \begin{cases} x & \text{if } x \geq 0 \\ \alpha (e^x - 1) & \text{if } x < 0 \end{cases}缓解神经元死亡问题;负值区域输出计算复杂度稍高;α需要调优
GELU\text{GELU}(x) = x \cdot \Phi(x)(Φ(x)是标准正态分布的累积分布函数)理论上优于ReLU;平滑非线性计算复杂度高;训练时间较长
SELU$\text{SELU}(x) = \lambda \begin{cases} x & \text{if } x \geq 0 \\ \alpha (e^x - 1) & \text{if } x < 0 \end{cases}$自动标准化输出;在深层网络中效果较好计算复杂度高;对参数和网络架构有一定要求
RReLU\text{RReLU}(x) = \begin{cases} x & \text{if } x \geq 0 \\ r \cdot x & \text{if } x < 0 \end{cases} (r为在某区间内随机采样的值)防止过拟合;在训练期间有正则化效果在推理阶段需确定r的值;计算复杂度稍高
PReLU\text{PReLU}(x) = \begin{cases} x & \text{if } x \geq 0 \\ \alpha x & \text{if } x < 0 \end{cases}缓解神经元死亡问题;参数可训练增加了模型的参数数量

详细说明:

  1. SiLU (Swish-1):

    • 优点: 平滑非线性特性,在某些任务上优于ReLU。

    • 缺点: 计算复杂度比ReLU稍高。

    • 公式\text{SiLU}(x) = x \cdot \sigma(x)

  2. ReLU (Rectified Linear Unit):

    • 优点: 计算简单,收敛速度快。

    • 缺点: 可能导致神经元死亡,即在训练过程中某些神经元永远不会被激活。

    • 公式\text{ReLU}(x) = \max(0, x)

  3. LeakyReLU:

    • 优点: 缓解了ReLU的神经元死亡问题。

    • 缺点: 输出不以零为中心,可能会影响梯度的均衡。

    • 公式\text{LeakyReLU}(x) = \max(0.01x, x)

  4. Hardswish:

    • 优点: 近似Swish但计算更高效。

    • 缺点: 相对于ReLU,计算复杂度稍高。

    • 公式\text{Hardswish}(x) = x \cdot \frac{\max(0, \min(x+3, 6))}{6}

  5. Mish:

    • 优点: 平滑非线性特性,在某些任务上优于ReLU和Swish。

    • 缺点: 计算复杂度高,训练时间较长。

    • 公式\text{Mish}(x) = x \cdot \tanh(\ln(1 + e^x))

  6. ELU (Exponential Linear Unit):

    • 优点: 缓解ReLU的神经元死亡问题,负值区域有输出。

    • 缺点: 计算复杂度稍高,参数α需要调优。

    • 公式\text{ELU}(x) = \begin{cases} x & \text{if } x \geq 0 \\ \alpha (e^x - 1) & \text{if } x < 0 \end{cases}

  7. GELU (Gaussian Error Linear Unit):

    • 优点: 理论上优于ReLU,平滑非线性。

    • 缺点: 计算复杂度高,训练时间较长。

    • 公式: \text{GELU}(x) = x \cdot \Phi(x),其中Φ(x)是标准正态分布的累积分布函数。

  8. SELU (Scaled Exponential Linear Unit):

    • 优点: 自动标准化输出,在深层网络中效果较好。

    • 缺点: 计算复杂度高,对参数和网络架构有一定要求。

    • 公式$\text{SELU}(x) = \lambda \begin{cases} x & \text{if } x \geq 0 \\ \alpha (e^x - 1) & \text{if } x < 0 \end{cases}$

  9. RReLU (Randomized Leaky ReLU):

    • 优点: 防止过拟合,在训练期间有正则化效果。

    • 缺点: 在推理阶段需确定r的值,计算复杂度稍高。

    • 公式: \text{RReLU}(x) = \begin{cases} x & \text{if } x \geq 0 \\ r \cdot x & \text{if } x < 0 \end{cases},其中r为在某区间内随机采样的值。

  10. PReLU (Parametric ReLU):

    • 优点: 缓解ReLU的神经元死亡问题,参数可训练。

    • 缺点: 增加了模型的参数数量。

    • 公式: \text{PReLU}(x) = \begin{cases} x & \text{if } x \geq 0 \\ \alpha x & \text{if } x < 0 \end{cases},其中α是可训练的参数。

 下面这些激活函数也都是大家耳熟能详的

激活函数公式优点缺点
Sigmoid\sigma(x) = \frac{1}{1 + e^{-x}}

- 平滑,输出范围在 (0,1)

- 适合处理概率问题

- 梯度消失问题

- 输出不是零中心

- 计算开销大

Tanh\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}}

- 输出零中心

- 梯度比Sigmoid更大

- 梯度消失问题

- 计算开销大

ReLU (Rectified Linear Unit)f(x) = \max(0, x)

- 简单且高效

- 收敛速度快

- 梯度爆炸问题

- Dying ReLU问题(神经元死亡)

Leaky ReLUf(x) = \max(0.01x, x)- 缓解Dying ReLU问题 - 保留ReLU的优点- 仍然可能发生梯度爆炸
Parametric ReLU (PReLU)f(x) = \max(\alpha x, x)

- 通过学习参数α来改进Leaky ReLU

- 更加灵活

- 计算开销稍高
ELU (Exponential Linear Unit)f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha(e^x - 1) & \text{if } x \le 0 \end{cases}

- 缓解梯度消失问题

- 更好的鲁棒性

- 计算更复杂

- 需要调整参数α

Swish( f(x) = x \cdot \sigma(x) )

- 训练效果优于ReLU

- 平滑梯度

- 计算复杂

- 需要额外的计算资源

Softplusf(x) = \ln(1 + e^x)

- 平滑ReLU

- 没有Dying ReLU问题

- 梯度消失问题

- 计算开销大

GELU (Gaussian Error Linear Unit)f(x) = x \cdot \Phi(x) 其中 Phi(x)是标准正态分布的累积分布函数

- 在某些任务上表现更好

- 平滑梯度

- 计算复杂

- 需要额外的计算资源

Maxoutf(x) = \max(w_1^T x + b_1, w_2^T x + b_2)

- 更强的表示能力

- 解决Dying ReLU问题

- 参数多,计算开销大

- 容易过拟合

2 .修改YOLOv8的激活函数

YOLOv8中默认是的激活函数是Silu激活函数

修改激活函数的只有一个步骤,很简单。因为YOLOv8已经给我们封装好了

详细的代码如下

class Conv(nn.Module):
    """Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)."""

    default_act = nn.SiLU()  # default activation

    def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):
        """Initialize Conv layer with given arguments including activation."""
        super().__init__()
        self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)
        self.bn = nn.BatchNorm2d(c2)
        self.act = self.default_act if act is True else act if isinstance(act, nn.Module) else nn.Identity()

    def forward(self, x):
        """Apply convolution, batch normalization and activation to input tensor."""
        return self.act(self.bn(self.conv(x)))

    def forward_fuse(self, x):
        """Perform transposed convolution of 2D data."""
        return self.act(self.conv(x))

阅读上面的代码可以知道,我们的只要找到default_act即可,阅读完整代码发现,在task.py中可以给default_act进行传参。

def parse_model(d, ch, verbose=True):  # model_dict, input_channels(3)
    """Parse a YOLO model.yaml dictionary into a PyTorch model."""
    import ast

    # Args
    max_channels = float("inf")
    nc, act, scales = (d.get(x) for x in ("nc", "activation", "scales"))
    depth, width, kpt_shape = (d.get(x, 1.0) for x in ("depth_multiple", "width_multiple", "kpt_shape"))
    if scales:
        scale = d.get("scale")
        if not scale:
            scale = tuple(scales.keys())[0]
            LOGGER.warning(f"WARNING ⚠️ no model scale passed. Assuming scale='{scale}'.")
        depth, width, max_channels = scales[scale]

    if act:
        Conv.default_act = eval(act)  # redefine default activation, i.e. Conv.default_act = nn.SiLU()
        if verbose:
            LOGGER.info(f"{colorstr('activation:')} {act}")  # print

同时这里也写明了,在yaml文件重新定义act即可

所以我们应该在yaml文件中新增 像 activation = nn.SiLU 即可

activation = nn.SiLU() 
activation = nn.ReLU()
activation = nn.LeakyReLU()
activation = nn.Hardswish()
activation = nn.Mish()
activation = nn.ELU()  
activation = nn.GELU() 
activation = nn.SELU()
activation = nn.RReLU() 
activation = nn.PReLU() 

完整的yaml文件

# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLOv8 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect

# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolov8n.yaml' will call yolov8.yaml with scale 'n'
  # [depth, width, max_channels]
  n: [0.33, 0.25, 1024] # YOLOv8n summary: 225 layers,  3157200 parameters,  3157184 gradients,   8.9 GFLOPs
  s: [0.33, 0.50, 1024] # YOLOv8s summary: 225 layers, 11166560 parameters, 11166544 gradients,  28.8 GFLOPs
  m: [0.67, 0.75, 768] # YOLOv8m summary: 295 layers, 25902640 parameters, 25902624 gradients,  79.3 GFLOPs
  l: [1.00, 1.00, 512] # YOLOv8l summary: 365 layers, 43691520 parameters, 43691504 gradients, 165.7 GFLOPs
  x: [1.00, 1.25, 512] # YOLOv8x summary: 365 layers, 68229648 parameters, 68229632 gradients, 258.5 GFLOPs

activation: nn.SiLU()  # 选择你需要的进行反注释,只留下一个激活函数即可
# activation: nn.ReLU()
# activation: nn.LeakyReLU()
# activation: nn.Hardswish()
# activation: nn.Mish()
# activation: nn.ELU()  
# activation: nn.GELU() 
# activation: nn.SELU()
# activation: nn.RReLU() 
# activation: nn.PReLU() 

# YOLOv8.0n backbone
backbone:
  # [from, repeats, module, args]
  - [-1, 1, Conv, [64, 3, 2]] # 0-P1/2
  - [-1, 1, Conv, [128, 3, 2]] # 1-P2/4
  - [-1, 3, C2f, [128, True]]
  - [-1, 1, Conv, [256, 3, 2]] # 3-P3/8
  - [-1, 6, C2f, [256, True]]
  - [-1, 1, Conv, [512, 3, 2]] # 5-P4/16
  - [-1, 6, C2f, [512, True]]
  - [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32
  - [-1, 3, C2f, [1024, True]]
  - [-1, 1, SPPF, [1024, 5]] # 9

# YOLOv8.0n head
head:
  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 6], 1, Concat, [1]] # cat backbone P4
  - [-1, 3, C2f, [512]] # 12

  - [-1, 1, nn.Upsample, [None, 2, "nearest"]]
  - [[-1, 4], 1, Concat, [1]] # cat backbone P3
  - [-1, 3, C2f, [256]] # 15 (P3/8-small)

  - [-1, 1, Conv, [256, 3, 2]]
  - [[-1, 12], 1, Concat, [1]] # cat head P4
  - [-1, 3, C2f, [512]] # 18 (P4/16-medium)

  - [-1, 1, Conv, [512, 3, 2]]
  - [[-1, 9], 1, Concat, [1]] # cat head P5
  - [-1, 3, C2f, [1024]] # 21 (P5/32-large)

  - [[15, 18, 21], 1, Detect, [nc]] # Detect(P3, P4, P5)

3. 完整代码分享

https://pan.baidu.com/s/1vSuA60RTZjfUQlVMy7HYrw?pwd=a8ji

提取码: a8ji

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1970661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HDU1089、1090、1091、1092、1093、1094、1095、1096、——A+B for Input-Output Practice

目录 HDU1089——AB for Input-Output Practice (I) HDU1090——AB for Input-Output Practice (II) HDU1091——AB for Input-Output Practice (III) HDU1092——AB for Input-Output Practice (IV) HDU1093——AB for Input-Output Practice (V) HDU1094——AB for Inpu…

VSCode上安装C#环境教程

本章教程,教你如何在vscode上,可以快速运行一些基础的c#代码。 1、下载 .NET Code SDK 下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/sdk-for-vs-code?utm_source=vs-code&utm_medium=referral&utm_campaign=sdk-install 根据自己的操作系统,选择…

NSSCTF-Web题目27(Nginx漏洞、php伪协议、php解析绕过)

目录 [HNCTF 2022 WEEK2]easy_include 1、题目 2、知识点 3、思路 [NSSRound#8 Basic]MyDoor 4、题目 5、知识点 6、思路 [HNCTF 2022 WEEK2]easy_include 1、题目 2、知识点 nginx日志漏洞执行系统命令 3、思路 打开题目&#xff0c;出现源码 题目要我们上传一个fi…

堆内存申请 - 华为OD统一考试(D卷)

OD统一考试(D卷) 分值: 100分 题解: Java / Python / C++ 题目描述 有一个总空间为100字节的堆,现要从中新申请一块内存,内存分配原则为: 优先分配紧接着前一块已使用的内存,分配空间足够时分配最接近申请大小的空闲内存。 输入描述 第1行是1个整数,表示期望申请的…

星环科技与宁夏银行“大数据联合实验室”揭牌,持续打造金融科技新范式

5月30-31日&#xff0c;2024向星力未来数据技术峰会期间&#xff0c;在峰会现场来宾共同见证下&#xff0c;星环科技与宁夏银行“大数据联合实验室”正式揭牌&#xff0c;宁夏银行股份有限公司首席信息官崔彦刚与星环科技副总裁邱磊共同为联合实验室揭牌。 星环科技与宁夏银行借…

后端开发和你聊聊 JVM 如何优化

作者&#xff1a;京东零售京麦研发 马万全 首先应该明确的是JVM调优不是常规手段&#xff0c;JVM的存在本身就是为了减轻开发对于内存管理的负担&#xff0c;当出现性能问题的时候第一时间考虑的是代码逻辑与设计方案&#xff0c;以及是否达到依赖中间件的瓶颈&#xff0c;最后…

16.1 微信支付

1. 概述 2. 微信支付时序图与流程 官方开发文档 Native支付文档 2.1 Native支付时序图 3. 订单表 单独开发一个支付平台,其他平台遇到支付业务需求时,可调用支付平台完成相应的支付业务 演示:平台有支付平台、商户平台 客户在商户平台发起Vip开通的支付请求,商户平台生成…

IDEA配置Tomcat,解决jsp页面显示问题(Please, configure Web Facet first!)和(There is no configured/running web-se)

在学校&#xff0c;大部分老师还是使用eclipse&#xff0c;他们使用的jsp页面&#xff0c;而我却想使用idea&#xff0c;来操纵jsp页面&#xff0c;可是为什么我将jsp放入项目当中&#xff0c;会出现报错&#xff0c;例如&#xff1a; 又或者&#xff1a; 哎呀&#xff0c;那怎…

数据结构与算法-二分搜索树遍历

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、二分搜…

Halcon 边缘提取(亚像素)

Halcon提供多种边缘提取算法。像素提取方法有常用的边缘提取算子或深度学习分割模型等。考虑到精度问题可能需要提取亚像素边缘。当然也可以提取轮廓&#xff1a;线、圆、椭圆等。本文只讨论提取轮廓。 1 基本概念 正常情况下&#xff0c;无需特殊操作即可提取边缘轮廓。 1…

这些天,有多少人去电影院看巴黎奥运会?

近期&#xff0c;巴黎奥运会的赛况频频登上热搜&#xff0c;中国奥运健儿们的奋勇拼搏令人热血沸腾。而许多观众&#xff0c;或由于租房情况不便于用投影仪观赏比赛&#xff0c;或由于期待更佳的观赛体验&#xff0c;因此有不少人去电影院观赛。由于实时数据的更新性和统计的复…

[Bugku] web-CTF靶场-计算器

计算器 1.开启环境 理论上来说题目最多只能填0-9的答案&#xff0c;如果需要填大于9的需要修改maxlength参数 得出flag

「码」上行动 一物一码+TPM让“多进货多卖货”不再是口号

“门店进货量翻倍&#xff0c;一些门店一个月连续补货3次&#xff01;”在与纷享销客产品经理的电话交流中&#xff0c;X饮品企业的张总难掩喜悦之情。 他兴奋地表示&#xff0c;在北方城市推出的基于一物一码的门店进销双激励码营销试点取得了显著成果&#xff0c;所有参与试…

开放原子校源行 | 武汉大学师生一行走进麒麟信安,开展社会实践交流活动

“开放原子校源行”是开放原子开源基金会作为国家级开源公益平台发起的长期性开源教育推广公益项目。项目拟通过资助高校设立开源社团、推广开源课程、设置开源助学金、引导开源实践等方式培育开源人才&#xff0c;加快将开源文化、理念和技术融入校园&#xff0c;引导广大师生…

CST软件如何实现S-parameter随其他参数变化的1D曲线

本期的FAQ更新一个非常高频的问题&#xff0c;如何实现S-parameter随其他参数变化的1D曲线。有的时候也不一定是S参数&#xff0c;可能是用户关心的阻抗结果&#xff0c;也可能是VSWR等。 在老版本的时候&#xff0c;CST软件有个后处理的宏可以很容易的将某一频点下的0D转换成…

引领未来交通新纪元:综合智慧监管平台

引领未来交通新纪元&#xff1a;综合智慧监管平台 在21世纪的今天&#xff0c;随着科技的飞速发展&#xff0c;交通运输行业作为国民经济的命脉&#xff0c;正经历着前所未有的变革与挑战。面对日益增长的运输需求、复杂多变的交通环境以及公众对安全、高效、绿色出行的迫切期…

AcWingTrie树

字典树的应用背景&#xff1a; 看以下几个题: 1、给出n个单词和m个询问&#xff0c;每次询问一个单词&#xff0c;回答这个单词是否在单词表中出现过 答:简单!map&#xff0c;短小精悍。 好。下一个 每次询问一个前缀&#xff0c;回答询问是多少个单词的前缀。2、给出n个单词和…

硬核!288页Python核心知识笔记(附思维导图,建议收藏)

不少朋友在学习Python时&#xff0c;都会做大量的笔记&#xff0c;随着学习进度的增加&#xff0c;笔记越来越厚&#xff0c;但有效内容反而越来越少。 今天就给大家分享一份288页Python核心知识笔记&#xff0c;相较于部分朋友乱糟糟的笔记&#xff0c;这份笔记更够系统地总结…

软件项目管理工具排行榜:国内外优劣对比

项目管理工具对项目开发的重要性不言而喻&#xff0c;通过对比业内对各个项目管理工具的认可度&#xff0c;筛选出人们公认的软件项目管理工具排行榜&#xff0c;具体详细如下&#xff1a; 1、Microsoft Project 简介&#xff1a;Microsoft Project是一款强大的基于云的项目管理…

【数据结构】包装类和泛型

&#x1f389;欢迎大家收看&#xff0c;请多多支持&#x1f339; &#x1f970;关注小哇&#xff0c;和我一起成长&#x1f680;个人主页&#x1f680; ⭐在更专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ &#x1f451;目录 包装类&#x1f319; ⭐基本类型对应的包…