各种激活函数的计算公式、图像以及实现代码

         激活函数已经成为神经网络中非常重要的一部分,随着各种类型的神经网络模型被人们开发出来,各种激活函数也应运而生,在不同的场景中,取得良好的效果。本文跟据著名的YOLO系列目标检测模型的源码 AlexeyAB Darknet,整理出目前神经网络模型中应用最广泛的20种激活函数,对它们的计算公式、图像特点进行介绍,并使用python代码实现这些激活函数的计算。

1、stair激活函数

        如图1所示,stair激活函数的图像就像阶梯一样。它的计算公式如下:

stair(x)=\left\{\begin{matrix} \left \lfloor x/2 \right \rfloor& (mod(\left \lfloor x \right \rfloor,2)=0)\\ (x+\left \lfloor x \right \rfloor)+\left \lfloor x/2 \right \rfloor&(mod(\left \lfloor x \right \rfloor,2)\neq 0) \end{matrix}\right.

式子中,\left \lfloor x \right \rfloor表示不大于x的整数,mod\left ( \left \lfloor x \right \rfloor,2 \right )表示对2取余数。 

图1 stair激活函数

 代码实现如下:


def stair(x):
    n=math.floor(x)
    if n%2==0:
        return math.floor(x/2.0)
    else:
        return (x-n)+math.floor(x/2.0)

2、hardtan激活函数

        如图2所示,hardtan激活函数是通过以直代曲近似实现tan函数,其计算公式如下:

hardtan(x)=\left\{\begin{matrix} -1.0 &(x<-1.0) \\ 1.0 &(x>1.0) \\ x & (other)\end{matrix}\right.

图2 hardtan激活函数

代码实现如下:

def hardtan(x):
    if x<-1.0:
        return -1.0
    elif x>1.0:
        return 1.0
    else:
        return x

3、linear激活函数

        linear激活函数是线性激活函数,输入x输出也是x,其函数图像如图3所示。

图3 线性激活函数

 代码实现:

def linear(x):
    return x

4、logistic激活函数

        logistic激活函数又叫sigmoid激活函数,如图4所示,logistic函数可以结果映射到0到1之间。其计算公式如下:

logistic(x)=\frac{1.0}{1.0+e^{-x}}

图4 logistic激活函数

 代码实现如下:

def logistic(x):
    return 1.0/(1.0+math.exp(-x))

5、loggy激活函数

        如图5所示,loggy的函数图像跟logistic有点相似,也是把输出映射到0到1之间。其计算公式如下:

loggy(x)=\frac{2.0}{1+e^{-x}}-1

图5 loggy激活函数

 代码实现:

def loggy(x):
    return 2.0/(1.0+math.exp(-x))-1.0

6、relu激活函数

        relu激活函数为线性整流函数,目的是把小于0的数截取掉,其函数图像如图6所示,其计算公式如下:

relu(x)=\left\{\begin{matrix} 0 & (x<0)\\ x & (x\geqslant 0) \end{matrix}\right.

图6 relu激活函数

 代码实现如下:

def relu(x):
    return x*(x>0)

7、relu6激活函数

        relu6和relu一样,也是线性整流函数,不同的是他对大于6的数进行了截断,其函数图像如图7所示,其计算公式如下:

relu6(x)=\left\{\begin{matrix} 0.0 & (x<0)\\ 6.0& (x>6)\\ x& (0\leq x\leq 6) \end{matrix}\right.

图7 relu6激活函数

 代码实现如下:

def relu6(x):
    if x<0:
        return 0.0
    elif x>6:
        return 6.0
    else:
        return x

8、elu激活函数

        elu激活函数的图像如图8所示,其计算公式如下:

elu(x)=\left\{\begin{matrix} x & (x\geq 0)\\ e^{x}& (x<0) \end{matrix}\right.

图8 elu激活函数

 代码实现:

def elu(x):
    return (x>=0)*x+(x<0)*(math.exp(x)-1.0)

9、selu激活函数

        selu激活函数如图9所示,其计算公式如下:

selu(x)=\left\{\begin{matrix} 1.0507*x& (x\geq 0)\\ 1.0507* 1.6732* (e^{x}-1.0)& (x<0) \end{matrix}\right.

图9 selu激活函数

 代码实现:                                                                                                                                        

def selu(x):
    return (x>=0)*1.0507*x+(x<0)*1.0507*1.6732*(math.exp(x)-1.0)

10、relie激活函数

                相比于relu激活函数,relie激活函数对于小于零的数据并不会直接截取为0,二是乘以一个小的系数,这个系数为0.01。其函数图像如图10所示,其计算公式如下:

relie(x)=\left\{\begin{matrix} 0.01*x & (x<0)\\ x& (x\geq 0) \end{matrix}\right.

图10 relie激活函数

 代码实现:

def relie(x):
    if x>0:
        return x
    else:
        return 0.01*x

11、ramp激活函数

        如图11所示为ramp激活函数,其计算公式如下:

ramp(x)=\left\{\begin{matrix} x+0.1* x & (x>0)\\ 0.1*x& (x\leq 0) \end{matrix}\right.

图11 ramp激活函数

代码实现:

def ramp(x):
    return x*(x>0)+0.1*x

12、leaky激活函数

        如图12所示为leaky激活函数的图像,它与relie函数有点像,它的斜率系数要比relie激活函数要大,其计算公式如下:

leaky(x)=\left\{\begin{matrix} x & (x\geq 0)\\ 0.1* x& (x<0) \end{matrix}\right.

图12 leaky激活函数

 代码实现如下:

def leaky(x):
    if x<0:
        return 0.1*x
    else:
        return x

13、tanh激活函数

        tanh激活函数的图像如图13所示,它的取值范围是[-1,1],其计算公式如下:

tanh(x)=\frac{2.0}{1.0+e^{-2* x}}-1

图13 tanh激活函数

 代码实现:

def tanh(x):
    return 2.0/(1.0+math.exp(-2.0*x))-1.0

14、gelu激活函数

        gelu激活函数的图像如图14所示,其计算公式如下:

gelu(x)=0.5* x(1.0+tanh(0.797885*x+0.035677*x^{3.0}))

式中,tanh为上文提到过的激活函数。

图14 gelu激活函数

代码实现如下:

def gelu(x):
    return 0.5*x*(1.0+math.tanh(0.797885*x+0.035677*math.pow(x,3.0)))

15、softplus激活函数

        softplus激活函数的图像如图15所示,其计算公式如下:

softplus(x,threshold)=\left\{\begin{matrix} x& (x>threshold)\\ e^{x}& (x<-threshold) \end{matrix}\right.

图15 softplus激活函数

 代码实现:

def softplus(x,threshold):
    if x>threshold:
        return x
    elif x<-threshold:
        return math.exp(x)
    else:
        return math.log(math.exp(x)+1.0)

 16、plse激活函数

        图16位plse激活函数的图像,其计算公式如下:

plse(x)=\left\{\begin{matrix} 0.01*(x+4.0) &(x<-4) \\ 0.01*(x-4.0)+1.0&(x>4) \\ 0.125*x+0.5& (-4\leq x\leq 4) \end{matrix}\right.

图16 plse激活函数

 代码实现:

def plse(x):
    if x<-4:
        return 0.01*(x+4.0)
    elif x>4:
        return 0.01*(x-4.0)+1.0
    else:
        return 0.125*x+0.5

17、lhtan激活函数

        图17是lhtan激活函数的图像,其计算公式为:

lhtan(x)=\left\{\begin{matrix} 0.001*x & (x<0)\\ 0.001*(x-1.0)+1.0&(x>1) \\ x& (0\leq x\leq 1) \end{matrix}\right.

图17 lhtan激活函数

 

代码实现:

def lhtan(x):
    if x<0:
        return 0.001*x
    elif x>1:
        return 0.001*(x-1.0)+1.0
    else:
        return x

18、swish激活函数

        图18是swish激活函数的图像,其计算公式如下:

swish(x)=x*logistic(x)

式中,logistic为上文所提到的激活函数,也叫sigmoid激活函数。

图18 swish激活函数

 代码实现:

def logistic(x):
    return 1.0/(1.0+math.exp(-x))

def swish(x):
    return x*logistic(x)

19、mish激活函数

        mish激活函数的图像如图19所示,其计算公式如下:

mish(x)=x*tanh(softplus(x,20.0))

式中tanh,softplus均为上文描述过的激活函数。

图19 mish激活函数

 代码实现如下:

def softplus(x,threshold):
    if x>threshold:
        return x
    elif x<-threshold:
        return math.exp(x)
    else:
        return math.log(math.exp(x)+1.0)

def tanh(x):
    return 2.0/(1.0+math.exp(-2.0*x))-1.0

def mish(x):
    return x*tanh(softplus(x,20.0))

20、hardmish激活函数

        hardmish激活函数为mish激活函数的近似形式,它的图像如图20所示,其计算公式如下:

hardmish(x)=\left\{\begin{matrix} x & (x>0)\\ x*x*0.5+x&(-2< x\leq 0) \\ 0& (x\leq -2) \end{matrix}\right.

图20 hardmish激活函数

 代码实现:

def hardmish(x):
    if x>0:
        return x
    elif x>-2:
        return x*x*0.5+x
    else:
        return 0

<think>好的,我现在需要回答用户关于如何使用Matlab绘制常见神经网络激活函数图像的问题。用户提到了sigmoid和ReLU,但可能还需要其他激活函数,比如Tanh、Leaky ReLU等。首先,我应该参考用户提供的站内引用,特别是引用[1]中的示例代码,看看他们是如何绘制sigmoid和ReLU的。 引用[1]中的代码使用了linspace生成x值,计算sigmoid函数,然后用plot绘制,并且分两个图显示。用户可能希望类似的代码结构,但可能需要扩展到其他激活函数。另外,引用[2]提到了更多激活函数,所以可能需要包含这些函数的实现。 接下来,我需要确保代码正确,符合Matlab语法,并且展示如何在一个图中绘制多个函数,或者分多个子图显示。用户可能需要清晰的图例和标注,所以每个函数应该用不同颜色或线型区分。 然后,考虑到用户的问题可能需要示例代码,我应该将每个激活函数的公式用LaTeX表示,符合系统级指令中的数学表达式要求。例如,sigmoid函数用$f(x) = \frac{1}{1 + e^{-x}}$,ReLU是$f(x) = \max(x, 0)$等。 另外,系统级指令要求生成相关问题,我需要考虑用户可能的后续问题,比如如何调整坐标轴、如何保存图像、不同激活函数的优缺点,或者在神经网络中的应用场景等。 现在,我需要整理代码,确保每个激活函数都有对应的公式和实现。例如,Tanh函数可以用tanh(x),Leaky ReLU需要处理x小于0的情况,乘以一个小的斜率如0.01x。ELU在x<0时使用α*(exp(x)-1)等。这些都需要正确的Matlab表达式。 然后,将代码分成多个部分,可能使用subplot来在一个窗口中显示多个激活函数,这样用户更容易比较。同时,添加图例、标题和坐标轴标签,使图像更清晰。 检查是否有语法错误,比如点运算(如exp(-x)可能需要点乘,但在这里x是向量,所以应该用数组运算,即点除)。在Matlab中,1./(1 + exp(-x))是正确的。 最后,生成相关问题,考虑用户可能想进一步了解的内容,比如激活函数的导数、不同激活函数的比较、在深度学习中的应用,或者如何自定义其他激活函数等。 总结步骤: 1. 准备x值,生成范围-10到10的向量。 2. 计算每个激活函数的y值。 3. 使用subplot创建多个子图,每个子图绘制一个函数。 4. 添加必要的标注和图例。 5. 提供扩展建议,如调整参数或添加其他激活函数。 6. 生成相关问题,引导用户深入学习。</think>### 使用Matlab绘制常见神经网络激活函数图像 以下是绘制sigmoid、ReLU、Tanh、Leaky ReLU、ELU激活函数图像的详细步骤和代码示例: #### 1. 定义输入范围和基础参数 ```matlab clc; clear all; x = linspace(-5, 5, 1000); % 定义输入范围[-5,5],增加采样点使曲线更平滑 alpha_leaky = 0.1; % Leaky ReLU的负区间斜率 alpha_elu = 1.0; % ELU的α参数 ``` #### 2. 计算各激活函数值 ```matlab % Sigmoid函数: $f(x) = \frac{1}{1 + e^{-x}}$ sigmoid = 1 ./ (1 + exp(-x)); % ReLU函数: $f(x) = \max(x, 0)$ relu = max(x, 0); % Tanh函数: $f(x) = \tanh(x)$ tanh_func = tanh(x); % Leaky ReLU函数: $f(x) = \begin{cases} x & x \geq 0 \\ \alpha x & x < 0 \end{cases}$ leaky_relu = x .* (x >= 0) + alpha_leaky * x .* (x < 0); % ELU函数: $f(x) = \begin{cases} x & x \geq 0 \\ \alpha(e^x - 1) & x < 0 \end{cases}$ elu = x .* (x >= 0) + alpha_elu * (exp(x) - 1) .* (x < 0); ``` #### 3. 绘制图像(分多个子图) ```matlab figure('Position', [100 100 1200 800]) % 设置图像窗口尺寸 % Sigmoid subplot(2,3,1) plot(x, sigmoid, 'b', 'LineWidth', 2) title('Sigmoid激活函数') xlabel('x'), ylabel('f(x)') grid on % ReLU subplot(2,3,2) plot(x, relu, 'r', 'LineWidth', 2) title('ReLU激活函数') xlabel('x'), ylabel('f(x)') grid on % Tanh subplot(2,3,3) plot(x, tanh_func, 'g', 'LineWidth', 2) title('Tanh激活函数') xlabel('x'), ylabel('f(x)') grid on % Leaky ReLU subplot(2,3,4) plot(x, leaky_relu, 'm', 'LineWidth', 2) title('Leaky ReLU激活函数 (\alpha=0.1)') xlabel('x'), ylabel('f(x)') grid on % ELU subplot(2,3,5) plot(x, elu, 'k', 'LineWidth', 2) title('ELU激活函数 (\alpha=1.0)') xlabel('x'), ylabel('f(x)') grid on ``` #### 4. 效果扩展建议 - 调整参数观察变化(如修改Leaky ReLU的$\alpha$值) - 添加更多激活函数(如Swish、GELU等) - 绘制导函数图像(如sigmoid的导数$f'(x) = f(x)(1-f(x))$) $$f_{\text{GELU}}(x) = x \Phi(x) = x \cdot \frac{1}{2}\left[1 + \text{erf}\left(\frac{x}{\sqrt{2}}\right)\right]$$ [^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

shifenglv

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

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

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

打赏作者

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

抵扣说明:

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

余额充值