PyTorch学习笔记之激活函数篇(四)

4、 Leaky ReLU 函数

4.1 公式

Leaky ReLU函数的公式:

f ( x ) = { x , x > = 0 λ x , x < 0 , λ ∈ ( 0 , 1 ) f(x) =\begin{cases} x&,x>=0 \\ \lambda x&,x<0,\lambda \in(0,1) \end{cases} f(x)={xλx,x>=0,x<0,λ(0,1)
Leakly ReLU函数的导函数:

f ′ ( x ) = { 1 , x > = 0 λ , x < 0 , λ ∈ ( 0 , 1 ) f'(x) = \begin{cases} 1&,x>=0 \\ \lambda &,x<0,\lambda \in(0,1) \end{cases} f(x)={1λ,x>=0,x<0,λ(0,1)

4.2 对应的图像

在这里插入图片描述

4.3 生成对应的图像代码

import numpy as np
import matplotlib.pyplot as plt

# 定义LeakyReLU函数
def leaky_relu(x, alpha=0.01):
    return np.where(x >= 0, x, alpha * x)

# 定义LeakyReLU的导数函数
def leaky_relu_derivative(x, alpha=0.01):
    return np.where(x >= 0, 1, alpha)

# 生成x值的范围
x = np.linspace(-10, 10, 100)

# 计算LeakyReLU函数值
y_leaky_relu = leaky_relu(x)

# 计算LeakyReLU导数值
y_leaky_relu_derivative = leaky_relu_derivative(x)

# 绘制LeakyReLU函数图像
plt.figure(figsize=(10, 5))
plt.subplot(1, 2, 1)
plt.plot(x, y_leaky_relu, label='LeakyReLU')
plt.title('LeakyReLU Function')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()

# 绘制LeakyReLU导数图像
plt.subplot(1, 2, 2)
plt.plot(x, y_leaky_relu_derivative, label='LeakyReLU Derivative')
plt.title('LeakyReLU Derivative')
plt.xlabel('x')
plt.ylabel('dy/dx')
plt.legend()

# 显示图像
plt.tight_layout()
plt.show()

4.4 优点与不足

Leaky ReLU函数(ReLU的改进):
1、与ReLU函数相比,把x的非常小的线性分量给予负输入(0.01x)来调整负值的零梯度问题;有助于扩大 ReLU 函数的范围,通常𝜆λ的值为 0.01 左右;函数范围是负无穷到正无穷。
2、LeakyRelu激活函数通过在负半轴添加一个小的正斜率(使得负轴的信息不会全部丢失)来解决ReLU激活函数的“死区”问题,该斜率参数𝜆λ是手动设置的超参数,一般设置为0.01。通过这种方式,LeakyRelu激活函数可以确保模型训练过程中神经元的权重在输入小于0的情况下依然会得到更新。
3、不会出

4.5 Leaky ReLU 函数

在PyTorch中,torch.leaky_relu 函数是用于实现 Leaky ReLU 激活函数的。Leaky ReLU 是一种改进的 ReLU(Rectified Linear Unit)函数,它允许小的非零梯度当输入值为负时。这有助于解决ReLU在负值区域的神经元“死亡”问题。

torch.leaky_relu 的基本使用如下:

import torch

# 创建一个张量
x = torch.tensor([-5.0, -3.0, 0.0, 2.0, 5.0])

# 应用 Leaky ReLU 函数
y = torch.leaky_relu(x, negative_slope=0.01)

print(y)

这里,negative_slope 参数控制负值区域的斜率。默认值是 0.01,这意味着当输入值小于零时,输出将是输入值乘以 0.01。对于非负输入值,Leaky ReLU 的行为类似于普通的 ReLU 函数,即输出就是输入值本身。

如果你想要在一个神经网络模型中使用 Leaky ReLU,你可以在定义模型时将其作为激活函数使用,例如:

import torch.nn as nn

class MyModel(nn.Module):
    def __init__(self):
        super(MyModel, self).__init__()
        self.fc1 = nn.Linear(10, 50)
        self.leaky_relu = nn.LeakyReLU(negative_slope=0.01)
        self.fc2 = nn.Linear(50, 1)

    def forward(self, x):
        x = self.fc1(x)
        x = self.leaky_relu(x)
        x = self.fc2(x)
        return x

model = MyModel()

在这个例子中,nn.LeakyReLU 被用作 MyModel 模型中的一个层,它将应用于全连接层 self.fc1 的输出。在模型的前向传播过程中,数据会首先通过全连接层,然后经过 Leaky ReLU 激活函数,最后再通过另一个全连接层。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

熊猫Devin

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

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

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

打赏作者

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

抵扣说明:

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

余额充值