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

前言

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

一、YOLOv10激活函数

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

SiLU激活函数

SiLU函数的公式定义为:
SiLU ( x ) = x ⋅   S i g m o i d ( x ) \text{SiLU}(x) = x \cdot \ Sigmoid(x) SiLU(x)=x Sigmoid(x)
其中   S i g m o i d ( x ) = 1 1 + e − x \ Sigmoid(x) = \frac{1}{1 + e^{-x}}  Sigmoid(x)=1+ex1是常见的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激活函数以其无上限但有下限、光滑且非单调的特性,为深度学习模型提供了更好的拟合复杂数据分布的能力。
Mish ( x ) = x ⋅ tanh ⁡ ( ln ⁡ ( 1 + e x ) ) \text{Mish}(x) = x \cdot \tanh(\ln(1 + e^x)) Mish(x)=xtanh(ln(1+ex))
在这里插入图片描述

实现代码

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
yolov5算法中,对激活函数进行了改进和扩展,引入了很多新奇有趣的激活函数。其中一些改进激活函数包括ReLU的变体,如PReLU、RReLU、FReLU等。此外,还引入了SwishMish激活函数。 Swish激活函数是一种将输入元素与sigmoid函数的输出相乘得到的结果,表达式为f(x) = x·sigmoid(βx)或简化为f(x) = x·σ(x),其中β是一个可调节的参数。Swish激活函数具有非线性特性,且在一些深度学习模型中表现出了良好的性能。 Mish激活函数是另一种基于sigmoid函数的变体,它的数学表示为f(x) = x·tanh(softplus(x))。Mish激活函数在一些目标检测任务中表现出了较好的性能,具有更好的平滑性和非线性特性。 此外,yolov5还引入了Acon系列和Dynamic ReLU系列等激活函数。Acon系列是一组基于自适应卷积操作的激活函数,具有局部感知性和自适应性。Dynamic ReLU系列是一组基于ReLU函数的变体,通过引入动态阈值来增加激活函数的非线性性能。 综上所述,yolov5算法通过引入多种改进激活函数,如PReLU、RReLU、FReLU、SwishMish、Acon系列和Dynamic ReLU系列等,来提升模型的表达能力和性能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [YOLOv5的Tricks | 【Trick1】关于激活函数Activation的改进汇总](https://blog.csdn.net/weixin_44751294/article/details/125085657)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Limiiiing

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

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

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

打赏作者

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

抵扣说明:

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

余额充值