YOLOv11改进策略【损失函数篇】| 替换激活函数为Mish、PReLU、Hardswish、LeakyReLU、ReLU6

简介: YOLOv11改进策略【损失函数篇】| 替换激活函数为Mish、PReLU、Hardswish、LeakyReLU、ReLU6

前言

在卷积神经网络中,激活函数通过在神经网络中引入非线性,使网络能够学习和逼近复杂函数,从而处理复杂的模式识别与分类问题。


专栏目录:YOLOv11改进目录一览 | 涉及卷积层、轻量化、注意力、损失函数、Backbone、SPPF、Neck、检测头等全方位改进
专栏地址:YOLOv11改进专栏——以发表论文的角度,快速准确的找到有效涨点的创新点!

一、YOLOv11激活函数

YOLOv11官方代码:https://github.com/ultralytics/ultralytics
YOLOv11的卷积模块中使用的基础激活函数为SiLU()

SiLU激活函数

SiLU函数的公式定义为:
$$ \text{SiLU}(x) = x \cdot \ Sigmoid(x) $$
其中$$\ Sigmoid(x) = \frac{1}{1 + e^{-x}}$$是常见的S型非线性函数。

特性

  • 非线性:SiLU函数能够将线性关系转换为非线性关系,这对于神经网络学习复杂模式至关重要。
  • 连续可导:在整个定义域内都是可微的,这使得在反向传播过程中的梯度计算更加稳定。
  • 无上界有下界:其输出没有上界,但存在下界(接近0),这种特性有助于防止网络饱和和梯度消失问题。
  • 平滑、非单调:与ReLU相比,SiLU函数更加平滑,并且在x≈−1.28时达到全局最小值−0.28,这可以起到一个隐式正则化的作用,抑制过大的权重。
    在这里插入图片描述

与其他激活函数的比较

  • 相比Sigmoid函数,SiLU函数不易出现梯度消失问题,且计算成本更低。
  • 相比ReLU函数,SiLU函数在负数区域内具有非零梯度,这有助于避免神经元“死亡”问题,并且在整个定义域内都是可微的,有利于优化。

    实现代码

class SiLU(nn.Module):
    @staticmethod
    def forward(x):
        return x * torch.sigmoid(x)

二、替换激活函数:Mish()

Mish激活函数以其无上限但有下限、光滑且非单调的特性,为深度学习模型提供了更好的拟合复杂数据分布的能力。
$$ \text{Mish}(x) = x \cdot \tanh(\ln(1 + e^x)) $$
在这里插入图片描述

实现代码

class Mish(nn.Module):
    @staticmethod
    def forward(x):
        return x * F.softplus(x).tanh()

替换方法

ultralytics/nn/modules/conv.py文件中的Conv模块实现中,定义了默认的激活函数,在torch中已经实现了Mish激活函数,需要修改的是在Conv模块,将Conv模块中的默认激活函数修改成nn.Mish(),其它不动。

    # default_act = nn.SiLU()  # default activation
    default_act = nn.Mish()  # default activation

在这里插入图片描述

模型训练

根据本机电脑算力,数据集划分信息,权重等相关配置设置好后运行运行。

在这里插入图片描述

训练效果根据各自数据集及使用的显卡配置不同而不同。

三、PReLU

PReLU的添加方式:

class PReLU(nn.Module):
    def __init__(self, num_parameters=1, init=0.25):
        super(PReLU, self).__init__()
        self.num_parameters = num_parameters
        self.weight = nn.Parameter(torch.Tensor(num_parameters).fill_(init))

    def forward(self, input):
        return torch.max(input, 0) + self.weight * torch.min(input, 0)

激活函数的修改方法均一致。

    # default_act = nn.SiLU()  # default activation
    default_act = nn.PReLU()  # default activation

四、Hardswish

Hardswish的实现代码:

def hardswish(x):
    return x * torch.clamp(x + 3, min=0, max=6) / 6

激活函数的修改方法均一致。

    # default_act = nn.SiLU()  # default activation
    default_act = nn.Hardswish()  # default activation

五、LeakyReLU

LeakyReLU的实现代码:

class LeakyReLU(nn.Module):
    def __init__(self, negative_slope=0.01):
        super(LeakyReLU, self).__init__()
        self.negative_slope = negative_slope

    def forward(self, x):
        return torch.max(x, self.negative_slope * x)

激活函数的修改方法均一致。

    # default_act = nn.SiLU()  # default activation
    default_act = nn.LeakyReLU()  # default activation

六、ReLU6

ReLU6的实现代码:

def relu6(x):
    return torch.clamp(x, min=0, max=6)

激活函数的修改方法均一致。

    # default_act = nn.SiLU()  # default activation
    default_act = nn.ReLU6()  # default activation

七、实现代码及YOLOv11修改步骤

模块完整介绍、个人总结、实现代码、模块改进、二次创新以及各模型添加步骤参考如下地址:

https://blog.csdn.net/qq_42591591/article/details/142819108

目录
相关文章
|
1月前
|
机器学习/深度学习 资源调度 数据可视化
RT-DETR改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu
RT-DETR改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu
49 2
RT-DETR改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu
|
1月前
|
机器学习/深度学习 资源调度 数据可视化
YOLOv11改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu
YOLOv11改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu
64 6
YOLOv11改进策略【损失函数篇】| 将激活函数替换为带有注意力机制的激活函数 ARelu
|
1月前
|
机器学习/深度学习
RT-DETR改进策略【损失函数篇】| 替换激活函数为Mish、PReLU、Hardswish、LeakyReLU、ReLU6
RT-DETR改进策略【损失函数篇】| 替换激活函数为Mish、PReLU、Hardswish、LeakyReLU、ReLU6
41 2
RT-DETR改进策略【损失函数篇】| 替换激活函数为Mish、PReLU、Hardswish、LeakyReLU、ReLU6
|
1月前
|
机器学习/深度学习 资源调度 计算机视觉
YOLOv11改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形自注意力 动态关注目标区域
YOLOv11改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形自注意力 动态关注目标区域
115 6
YOLOv11改进策略【Conv和Transformer】| CVPR-2022 Deformable Attention Transformer 可变形自注意力 动态关注目标区域
|
1月前
|
机器学习/深度学习 TensorFlow 算法框架/工具
YOLOv11改进策略【卷积层】| 利用MobileNetv4中的UIB、ExtraDW优化C3k2
YOLOv11改进策略【卷积层】| 利用MobileNetv4中的UIB、ExtraDW优化C3k2
76 0
YOLOv11改进策略【卷积层】| 利用MobileNetv4中的UIB、ExtraDW优化C3k2
|
10月前
|
机器学习/深度学习 编解码 边缘计算
YOLOv5改进 | 卷积模块 | 用ShuffleNetV2卷积替换Conv【轻量化网络】
本文介绍了如何在YOLOv5中用ShuffleNetV2替换卷积以减少计算量。ShuffleNetV2是一个轻量级网络,采用深度可分离卷积、通道重组和多尺度特征融合技术。文中提供了一个逐步教程,包括ShuffleNetV2模块的代码实现和在YOLOv5配置文件中的添加方法。此外,还分享了完整的代码链接和GFLOPs的比较,显示了GFLOPs的显著减少。该教程适合初学者实践,以提升深度学习目标检测技能。
YOLOv5改进 | 卷积模块 | 用ShuffleNetV2卷积替换Conv【轻量化网络】
|
10月前
|
机器学习/深度学习 编解码 算法
YOLOv5改进 | 主干网络 | 用EfficientNet卷积替换backbone【教程+代码 】
在YOLOv5的GFLOPs计算量中,卷积占了其中大多数的比列,为了减少计算量,研究人员提出了用EfficientNet代替backbone。本文给大家带来的教程是**将原来的主干网络替换为EfficientNet。文章在介绍主要的原理后,将手把手教学如何进行模块的代码添加和修改,并将修改后的完整代码放在文章的最后,方便大家一键运行,小白也可轻松上手实践。以帮助您更好地学习深度学习目标检测YOLO系列的挑战。
|
8月前
|
机器学习/深度学习
神经网络可能不再需要激活函数?Layer Normalization也具有非线性表达!
【7月更文挑战第14天】研究表明,层归一化(LayerNorm)可能具备非线性表达能力,挑战了神经网络对激活函数的依赖。在LN-Net结构中,仅使用线性层与LayerNorm就能实现复杂分类,其VC维度下界证明了非线性表达。尽管如此,是否能完全替代激活函数及如何有效利用这一特性仍需更多研究。[arXiv:2406.01255]
100 5
|
9月前
|
存储 机器学习/深度学习 计算机视觉
【YOLOv8改进-卷积Conv】 OREPA(Online Convolutional Re-parameterization):在线卷积重参数化
**OREPA**是在线卷积重参数化的缩写,它提出了一种两阶段流程来减少深度模型训练的开销。该方法通过线性缩放层优化复杂训练块,并在训练完成后将其压缩为单个卷积层,降低内存使用和提高训练速度。与现有技术相比,OREPA能减少约70%的训练内存开销,提升2倍训练速度,并在ImageNet上提高最多0.6%的准确性。此外,它还在目标检测和语义分割任务中表现出色。论文和代码可在提供的链接中找到。
|
9月前
|
机器学习/深度学习 计算机视觉
YOLOv8改进 | 卷积模块 | 用坐标卷积CoordConv替换Conv
💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡