神经网络中常见的激活函数:理解与实践

news2024/11/15 15:50:48

神经网络中常见的激活函数:理解与实践

在神经网络中,激活函数是一个非常重要的组成部分,它为神经元引入了非线性特性,使得神经网络可以拟合各种复杂的函数关系。本文将介绍9种常见的激活函数,包括它们的概述、公式以及用Python实现示例代码,并对它们进行比较和总结。

1. 概述

激活函数是神经网络中的一个关键组件,它决定了神经元的输出是否被激活。在神经网络的每一层中,都会使用激活函数对输入进行非线性变换,从而使得神经网络可以逼近复杂的函数关系。

2. 激活函数的公式

1. Sigmoid函数

Sigmoid函数是一种常用的激活函数,它将输入的值映射到0到1之间的输出。

公式:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1

2. TanH函数

TanH函数是Sigmoid函数的变体,将输入的值映射到-1到1之间的输出。

公式:
tanh ( x ) = e x − e − x e x + e − x \text{tanh}(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex

3. ReLU函数

ReLU函数是一种简单而有效的激活函数,它将所有负值都设置为零,保持正值不变。

公式:
f ( x ) = max ⁡ ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x)

4. Leaky ReLU函数

Leaky ReLU函数是对ReLU的改进,它在负值部分引入了一个小的斜率,避免了ReLU可能出现的“神经元死亡”问题。

公式:
f ( x ) = { x , if  x > 0 α x , otherwise f(x) = \begin{cases} x, & \text{if } x > 0 \\ \alpha x, & \text{otherwise} \end{cases} f(x)={x,αx,if x>0otherwise

5. Parametric ReLU (PReLU)函数

PReLU函数是Leaky ReLU的进一步改进,它允许斜率成为可学习的参数,而不是固定的超参数。

公式:
f ( x ) = { x , if  x > 0 α x , otherwise f(x) = \begin{cases} x, & \text{if } x > 0 \\ \alpha x, & \text{otherwise} \end{cases} f(x)={x,αx,if x>0otherwise

6. Exponential Linear Unit (ELU)函数

ELU函数在负值部分引入了一个非线性项,相对于ReLU,它在负值区域的输出更接近于零。

公式:
f ( x ) = { x , if  x > 0 α ( e x − 1 ) , otherwise f(x) = \begin{cases} x, & \text{if } x > 0 \\ \alpha (e^x - 1), & \text{otherwise} \end{cases} f(x)={x,α(ex1),if x>0otherwise

7. Swish函数

Swish函数是一种新型的激活函数,它结合了Sigmoid函数和ReLU函数的特点,具有平滑的非线性性质。

公式:
Swish ( x ) = x ⋅ σ ( x ) \text{Swish}(x) = x \cdot \sigma(x) Swish(x)=xσ(x)

8. Softplus函数

Softplus函数是一种平滑的近似于ReLU函数的激活函数,它可以保证输出是非负的。

公式:
Softplus ( x ) = ln ⁡ ( 1 + e x ) \text{Softplus}(x) = \ln(1 + e^x) Softplus(x)=ln(1+ex)

9. Mish函数

Mish函数是一种新型的激活函数,具有类似于Swish函数的性质,但更平滑,并且在实践中表现良好。

公式:
Mish ( x ) = x ⋅ tanh ⁡ ( ln ⁡ ( 1 + e x ) ) \text{Mish}(x) = x \cdot \tanh(\ln(1 + e^x)) Mish(x)=xtanh(ln(1+ex))

3. 用Python实现示例代码

下面将用Python实现示例代码,并通过可视化的方式展示不同激活函数的效果。

import numpy as np
import matplotlib.pyplot as plt

# 定义各种激活函数
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def tanh(x):
    return np.tanh(x)

def relu(x):
    return np.maximum(0, x)

def leaky_relu(x, alpha=0.01):
    return np.where(x > 0, x, alpha * x)

def parametric_relu(x, alpha=0.01):
    return np.where(x > 0, x, alpha * x)

def elu(x, alpha=1.0):
    return np.where(x > 0, x, alpha * (np.exp(x) - 1))

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

def softplus(x):
    return np.log(1 + np.exp(x))

def mish(x):
    return x * np.tanh(np.log(1 + np.exp(x)))

# 生成输入数据
x = np.linspace(-5, 5, 100)

# 计算各个激活函数的输出
y_sigmoid = sigmoid(x)
y_tanh = tanh(x)
y_relu = relu(x)
y_leaky_relu = leaky_relu(x)
y_parametric_relu = parametric_relu(x)
y_elu = elu(x)
y_swish = swish(x)
y_softplus = softplus(x)
y_mish = mish(x)

# 绘制结果
plt.figure(figsize=(14, 10))

plt.subplot(3, 3, 1)
plt.plot(x, y_sigmoid, label='Sigmoid', color='blue')
plt.title('Sigmoid')
plt.grid(True)

plt.subplot(3, 3, 2)
plt.plot(x, y_tanh, label='TanH', color='red')
plt.title('TanH')
plt.grid(True)

plt.subplot(3, 3, 3)
plt.plot(x, y_relu, label='ReLU', color='green')
plt.title('ReLU')
plt.grid(True)

plt.subplot(3, 3, 4)
plt.plot(x, y_leaky_relu, label='Leaky ReLU', color='orange')
plt.title('Leaky ReLU')
plt.grid(True)

plt.subplot(3, 3, 5)
plt.plot(x, y_parametric_relu, label='PReLU', color='purple')
plt.title('Parametric ReLU

')
plt.grid(True)

plt.subplot(3, 3, 6)
plt.plot(x, y_elu, label='ELU', color='brown')
plt.title('ELU')
plt.grid(True)

plt.subplot(3, 3, 7)
plt.plot(x, y_swish, label='Swish', color='cyan')
plt.title('Swish')
plt.grid(True)

plt.subplot(3, 3, 8)
plt.plot(x, y_softplus, label='Softplus', color='magenta')
plt.title('Softplus')
plt.grid(True)

plt.subplot(3, 3, 9)
plt.plot(x, y_mish, label='Mish', color='olive')
plt.title('Mish')
plt.grid(True)

plt.tight_layout()
plt.show()
  1. 导入库:

    • numpy:用于数值计算。
    • matplotlib.pyplot:用于数据可视化。
  2. 定义激活函数:

    • sigmoid:实现Sigmoid激活函数。
    • tanh:实现TanH激活函数。
    • relu:实现ReLU激活函数。
    • leaky_relu:实现Leaky ReLU激活函数。
    • parametric_relu:实现Parametric ReLU激活函数。
    • elu:实现ELU激活函数。
    • swish:实现Swish激活函数。
    • softplus:实现Softplus激活函数。
    • mish:实现Mish激活函数。
  3. 生成输入数据:

    • 使用numpylinspace函数生成范围在-5到5之间的100个均匀间隔的数据点。
  4. 计算各个激活函数的输出:

    • 分别对输入数据应用不同的激活函数,得到对应的输出值。
  5. 绘制结果:

    • 使用matplotlib.pyplot绘制了一个3x3的子图,每个子图表示一个激活函数的输出。
    • 在每个子图中,使用plot函数绘制了输入数据和对应激活函数的输出曲线。
    • 使用title函数添加了每个子图的标题,表示对应的激活函数名称。
    • 使用grid函数添加了网格线,增强了可视化效果。
    • 使用tight_layout函数调整子图布局,使得各个子图之间的间距合适。
  6. 显示图像:

    • 使用show函数显示绘制的图像。

在这里插入图片描述

总结

本文介绍了神经网络中常见的9种激活函数,包括它们的概述、公式和用Python实现示例代码,并通过可视化展示了它们的效果。每种激活函数都有其特点和适用场景,选择合适的激活函数对于神经网络的训练和性能至关重要。读者可以根据实际问题的需求和数据的特点,选择合适的激活函数来提高神经网络的性能和效果。

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

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

相关文章

安卓中级控件(图形、选择按钮、文本输入、对话框)

图形定制 图形Drawable Android把所有能够显示的图形都抽象为Drawable类(可绘制的)。这里的图形不止是图片,还包括色块、画板、背景等。 包含图片在内的图形文件放在res目录的各个drawable目录下,其中drawable目录一般保存描述性…

相机知识的补充

一:镜头 1.1MP的概念 相机中MP的意思是指百万像素。MP是mega pixel的缩写。mega意为一百万,mega pixel 指意为100万像素。“像素”是相机感光器件上的感光最小单位。就像是光学相机的感光胶片的银粒一样,记忆在数码相机的“胶片”&#xff…

windows 驱动开发-DMA技术(二)

前面描述了DMA技术中适配器相关的部分以及DMA的分类,接下来看一下系统具体在支持两种DMA时候的操作的细微差别。 此处解释一下Scatter/Gather,这个也翻译为散点/收集,是指指示设备能够读取或写入内存中的任何区域,而不仅仅是特定…

YOLO系列改进,自研模块助力涨点

目录 一、原理 二、代码 三、添加到YOLOv5中 一、原理 论文地址:

LiveCD镜像文件的定制化

最近想要定制化一款属于自己的LiveCD镜像文件,并且里边封装好所需要的软件程序,本文将会记录具体的操作步骤,供有需要的人参考借鉴。 环境说明: 环境配置说明配置参数编码环境Centos7.9LiveCD文件CentOS-7-livecd-x86_64.iso 附…

袁庭新ES系列18节|Spring Data Elasticsearch高级

前言 这一章节袁老师将带领同学们来学习Spring Data Elasticsearch高级操作相关的内容。我们继续来探索SDE是如何将原始操作Elasticsearch的客户端API进行封装的,以及通过Spring Data Elasticsearch如何来操作ES。准备好了吗?我们继续来探索ES的内容。 …

探索AI工具的巅峰:个人体验与深度剖析

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

【Go语言快速上手(六)】管道, 网络编程,反射,用法讲解

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Go语言专栏⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习更多Go语言知识   🔝🔝 GO快速上手 1. 前言2. 初识管道3. 管…

自定义SpringBoot的starter

案例需求:自定义redis-stater。要求当导入redis坐标时,SpringBoot自动创建Jedis的Bean。 实现步骤: 1、创建redis-spring-boot-autoconfigure模块 2、创建redis-spring-boot-starter模块,依赖redis-spring-boot-autoconfigure的…

Codeforces Round 938 (Div. 3)H-The Most Reckless Defense

来源 题目 You are playing a very popular Tower Defense game called "Runnerfield 2". In this game, the player sets up defensive towers that attack enemies moving from a certain starting point to the players base. You are given a grid of size nm&a…

Delta lake with Java--利用spark sql操作数据2

上一篇文章尝试了建库,建表,插入数据,还差删除和更新,所以在这篇文章补充一下,代码很简单,具体如下: import org.apache.spark.sql.SaveMode; import org.apache.spark.sql.SparkSession;publi…

DRF中的请求入口分析及request对象分析

DRF中的请求入口分析及request对象分析 django restframework框架是在django的基础上又给我们提供了很多方便的功能,让我们可以更便捷基于django开发restful API 1 drf项目 pip install django pip install djangorestframework1.1 核心配置 INSTALLED_APPS [d…

【源码阅读】Golang中的go-sql-driver库源码探究

文章目录 前言一、go-sql-driver/mysql1、驱动注册:sql.Register2、驱动实现:MysqlDriver3、RegisterDialContext 二、总结 前言 在上篇文章中我们知道,database/sql只是提供了驱动相关的接口,并没有相关的具体实现,具…

PG数据库结构与oracle比较

1.数据库集簇逻辑结构 数据库集簇概念:一个大的数据库是由若干个小的数据库组成,实现数据的隔离存放,在概念上应该是与mysql一样的 在mysql中可以用show database列出数据库 PG中用\l 数据库对象存放在数据库中: PG中的所有数据…

Mac 上安装多版本的 JDK 且实现 自由切换

背景 当前电脑上已经安装了 jdk8; 现在再安装 jdk17。 期望 完成 jdk17 的安装,并且完成 环境变量 的配置,实现自由切换。 前置补充知识 jdk 的安装路径 可以通过查看以下目录中的内容,确认当前已经安装的 jdk 版本。 cd /Library/Java/Java…

Maven3.9.6下载安装教程

(/≧▽≦)/~┴┴ 嗨~我叫小奥 ✨✨✨ 👀👀👀 个人博客:小奥的博客 👍👍👍:个人CSDN ⭐️⭐️⭐️:Github传送门 🍹 本人24应届生一枚,技术和水平有…

Typescript精进:前端必备的5大技巧(AI写作)

首先,这篇文章是基于笔尖AI写作进行文章创作的,喜欢的宝子,也可以去体验下,解放双手,上班直接摸鱼~ 按照惯例,先介绍下这款笔尖AI写作,宝子也可以直接下滑跳过看正文~ 笔尖Ai写作:…

瑞_23种设计模式_解释器模式

文章目录 1 解释器模式(Interpreter Pattern)1.1 介绍1.2 概述1.2.1 文法(语法)规则1.2.2 抽象语法树 1.3 解释器模式的结构1.4 解释器模式的优缺点1.5 解释器模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代…

【右一的开发日记】全导航,持续更新...

文章目录 📚前端【跟课笔记】🐇核心技术🐇高级技术 📚捣鼓捣鼓🐇小小案例🐇喵喵大王立大功🐇TED自用学习辅助网站🐇世界top2000计算机科学家可视化大屏🐇基于CBDB的唐代历…

【Java EE】MyBatis使用注解操作数据库

文章目录 🍀参数传递🌴增(Insert)🌸返回主键 🍃删(Delete)🌳改(Update)🌲查(Select)🌸起别名🌸结果映射🌸开启驼峰命名(推荐) ⭕总结 🍀参数传递 需求: 查找…