深度学习--常见激活函数的实现

news2024/11/18 3:25:32

常见激活函数

  • 简介
    • 激活函数的初衷
    • 激活函数必须是非线性函数
  • 常见的激活函数与实现
    • Step跃阶函数
      • 公式
      • 优点
      • 缺点
      • 应用场景
      • 代码实现
      • 效果图
    • Sigmoid函数与代码实现
      • 公式
      • Sigmoid函数优点
      • Sigmoid函数缺点
      • 代码实现
      • 效果图
    • ReLu
      • 公式
      • 优点
      • 缺点
      • 代码
      • 效果图
    • LeakyReLU
      • 公式
      • 优点
      • 缺点
      • 代码
      • 效果图
    • tanh
      • 公式
      • 优点
      • 缺点
      • 应用场景
      • 代码
      • 效果图
    • Softmax
      • 公式
      • 代码
      • 效果图

简介

在神经网络和深度学习中,激活函数(activation function)是对神经元的输出进行处理的一种函数。神经网络的激活函数必须是非线性的,它的作用是引入非线性因素,从而使神经网络可以处理更加复杂的数据,并且提高模型的准确率。

激活函数的初衷

我们使用感知机输出对应的数字0和1。但是我们发现这是一个分段函数,有两个部分组成。很是冗余,不够简便,那有没有一种可能呢,只需要一个函数就可以表示整个分段的过程,当然有,即使用激活函数。
在这里插入图片描述
使用激活函数h(x)来表示上述的分段函数过程,达到简化的效果。
在这里插入图片描述

激活函数必须是非线性函数

在这里插入图片描述

常见的激活函数与实现

激活函数常见的几种类型包括:

  • Sigmoid函数:将输入值压缩到0和1之间,常用于二分类任务;
  • tanh函数:将输入值压缩到-1和1之间,比Sigmoid函数更加对称;
  • ReLU函数:常用于深度神经网络中,可以有效地避免梯度消失的问题;
  • LeakyReLU函数:ReLU函数的改进版,在负数域的导数为0的情况下,引入一个小的斜率,可以缓解ReLU函数的死亡问题
  • Softmax函数:对多分类问题中的概率进行归一化,使得所有类别的概率之和为1。
  • **Step跃阶函数:**简单,非线性,但由于不可导在深度学习中应用受限
    不同的激活函数在不同场景下有着不同的优缺点,需要根据具体的任务和数据进行选择。具体问题具体分析

Step跃阶函数

公式

在这里插入图片描述

优点

  • 简单性和非线性特性

缺点

  • 非导数性:Step跃阶函数不连续,不可微分,其导数在阈值处为0,这样就不利于使用梯度下降等方法优化模型参数,也不利于后向传播算法的计算。
  • 饱和性:Step跃阶函数在饱和区间内输出固定值,导致了梯度消失问题,这意味着如果一个神经元在训练中被困在了饱和状态,那么它将会停止学习。

应用场景

因此,Step跃阶函数在神经网络和深度学习中的应用极其有限,通常不建议使用。实际上,为了解决其导数不连续、不可微分的问题,一些激活函数如Sigmoid、ReLU、LeakyReLU、tanh等都被提出并广泛应用。

由于其简单性和非线性特性,Step跃阶函数在一些特殊场景下仍然有一定的应用,比如在人工神经元模型中,也可以用于控制某些电路元件的开关。

代码实现

from matplotlib import pyplot as plt
import numpy as np


def step_function(x):
    y = x > 0
    print("y:",y) # 输出的布尔值
    # y = y.astype(np.int64) # 这里写int会出错
    y = [int(num) for num in y] # 与上句使用的astype效果一样
    return y

x = np.array([1.5,-2,5.0])
step_function(x)

x1 = np.arange(-6,7,1)
y1 = step_function(x1)
plt.plot(x1,y1)
plt.show()

效果图

在这里插入图片描述

Sigmoid函数与代码实现

公式

在这里插入图片描述

Sigmoid函数优点

  • 输出值被转化到(0,1)之间,可以用来做二分类问题,表示某件事发生的概率(比如一张图片是否为猫)
  • 而且它的输出值相对于输入值是可导的,可以观看函数中有e的x次方,比较好求导,非常适合用于梯度下降算法中,可以帮助神经网络更容易、更快地收敛

Sigmoid函数缺点

  • 输入很大的时候,输出函数会趋于饱和,在神经网络的后期训练中,这可能会导致梯度消失,导致网络无法学习到有效的特征。可见下图中当x的值很大或者很小时,y的值接近1和0。
  • 此外,由于其非对称性,它倾向于使神经元的激活输出处于饱和状态,导致一些神经元失活降低了神经网络的性能

代码实现

from matplotlib import pyplot as plt
import numpy as np


def sigmoid(x):
    y = 1/(1+np.exp(-x))
    return y

x1 = np.arange(-6,7,1)
y2 = sigmoid(x1) 
plt.title("sigmoid functions") # 给图设置标题
plt.xlabel("x axis") # 设置x轴
plt.ylabel("y axis") # 设置y轴
plt.plot(x1,y2,'y') # 传入x和y的值 创建图
plt.show() # 展示图

效果图

可以发现图像处于0和1之间,因此适合进行二分类问题
在这里插入图片描述

ReLu

公式

当输入x小于0时,输入y为0。当x大于等于0时,输出为x
在这里插入图片描述

优点

  • 非线性:ReLU函数是一种非线性函数,在神经网络中可以引入非线性特征,提高模型表达能力。
  • 稀疏性:ReLU函数在输入为负数时输出为0,因此可以在神经网络中产生稀疏表示,从而减少神经元的数量,提高计算效率
  • 收敛速度快:ReLU函数在输入为正数时,其导数恒为1,因此在梯度下降过程中不会出现梯度消失问题,能够加速神经网络的收敛速度。
  • 计算速度快:ReLU函数简单、快速,应用更为广泛。

缺点

  • 比如当输入为负数时,梯度恒为0,可能产生死亡神经元,影响模型的精度,因此需要进行一定的修正,如LeakyReLU和PReLU等。

代码


# ReLU函数相当于在自变量小于0的时候为0,
# 大于零的时候和自变量相等,也就是在自变量和0中取最大值
from matplotlib import pyplot as plt
import numpy as np


def ReLU(x):
    y = np.maximum(0,x)
    return y

x1 = np.arange(-6,7,1)
y3 = ReLU(x1)
plt.plot(x1,y3)
plt.show()

效果图

在这里插入图片描述

LeakyReLU

公式

在这里插入图片描述
其中,α是一个小于1的常数,通常取0.01。

优点

  • ReLU函数的优点
  • 可以缓解ReLU函数的死亡神经元问题,增强了神经网络的稳定性和泛化能力,并且在一些图像分类和对象检测等任务中取得了较好的性能表现。

缺点

  • LeakyReLU函数并不能完全消除死亡神经元问题,因此可以在实际应用中使用其他方法如Dropout、Batch Normalization等进一步解决问题。

代码

from matplotlib import pyplot as plt
import matplotlib
import numpy as np

def leaky_relu(x, alpha=0.01):
    """
    LeakyReLU函数的实现
    Args:
      x: 输入向量或矩阵
      alpha: 斜率系数,一般取较小的值,默认为0.01
    Returns:
      LeakyReLU函数的输出,与输入维度相同
    """
    y = np.copy(x)
    y[y<0] *= alpha
    return y

zhfont1 = matplotlib.font_manager.FontProperties(fname="SourceHanSansSC-Bold.otf") 
plt.title("LeakyReLu 函数",fontproperties=zhfont1)

x1 = np.arange(-6,7,1,dtype=np.float64)
y3 = leaky_relu(x1)
plt.plot(x1,y3)
plt.show()

效果图

在这里插入图片描述

tanh

公式

在这里插入图片描述

优点

  • tanh函数同样可以将输入值映射到一个**[-1, 1]的区间内**,而且在输入值接近0时,tanh函数的输出值变化范围更大,具有更强的非线性特征

缺点

  • 需要注意的是,与Sigmoid函数一样,tanh函数也存在梯度消失的问题,这可能导致模型训练困难,因此在一些深层神经网络的应用中,需要采用其他类型的激活函数和优化策略来解决问题。

应用场景

tanh函数在神经网络中常用于处理具有正负值的数据,比如图像、音频等数据。同时,tanh函数在神经网络中也是一种常用的激活函数,主要应用于RNN网络中的LSTM、GRU等模型,能够平衡模型的记忆能力和遗忘能力,提高模型的性能和鲁棒性。

代码

import matplotlib
from matplotlib import pyplot as plt
import numpy as np

def tanh(x):
    """
    双曲正切函数的实现
    Args:
      x: 输入向量或矩阵
    Returns:
      tanh函数的输出,与输入维度相同
    """
    return np.tanh(x)

zhfont1 = matplotlib.font_manager.FontProperties(fname="SourceHanSansSC-Bold.otf") 
plt.title("tanh 函数",fontproperties=zhfont1)

x1 = np.arange(-6,7,1,dtype=np.float64)
y3 = tanh(x1)
plt.plot(x1,y3)
plt.show()

效果图

在这里插入图片描述

Softmax

公式

在这里插入图片描述
Softmax函数将输入向量中的每个元素从实数范围映射到(0,1)之间,且使输出向量中所有元素之和为1,因此输出向量可被理解为一个概率分布,其中每个元素表示对应类别的预测概率。在神经网络中,通常将Softmax函数作为最后一层的激活函数来输出分类预测结果。

代码

import matplotlib
from matplotlib import pyplot as plt
import numpy as np

def softmax(x, axis=-1):
    """
    Softmax函数的实现
    Args:
      x: 输入向量或矩阵
      axis: 指定沿哪个维度进行Softmax操作,默认为最后一个维度
    Returns:
      Softmax函数的输出,与输入维度相同
    """
    # 将输入减去最大值,避免指数爆炸
    x_exp = np.exp(x - np.max(x, axis=axis, keepdims=True))
    # 计算Softmax分母
    x_sum = np.sum(x_exp, axis=axis, keepdims=True)
    # 计算Softmax输出
    return x_exp / x_sum

zhfont1 = matplotlib.font_manager.FontProperties(fname="SourceHanSansSC-Bold.otf") 
plt.title("softmax 函数",fontproperties=zhfont1)

x1 = np.arange(-6,7,1,dtype=np.float64)
y3 = softmax(x1)
plt.plot(x1,y3)
plt.show()

效果图

在这里插入图片描述

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

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

相关文章

快速构建机器学习Web应用的神器:Gradio

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

FreeRTOS实时操作系统(一)RTOS的基本概念

文章目录 前言操作系统分类编程风格纠正FreeRTOS介绍任务调度方式任务状态 总结 前言 最近买了把75系列的机械键盘&#xff0c;没有数字区域&#xff0c;想起来稚辉君曾经做过一把客制化键盘&#xff0c;于是下载了资料准备学一学&#xff0c;网上很多开源的都是用的ATMEGA32U…

面试专题:Redis

1.redis简介 简单来说 redis 就是一个数据库&#xff0c;不过与传统数据库不同的是 redis 的数据是存在内存中的&#xff0c;所以存写速度非常快&#xff0c; 因此 redis 被广泛应用于缓存方向。另外&#xff0c;redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不…

Redis入门 - Redis Stream

原文首更地址&#xff0c;阅读效果更佳&#xff01; Redis入门 - Redis Stream | CoderMast编程桅杆Redis入门 - Redis Stream Redis Stream 是 Redis 5.0 版本新增加的数据结构。 Redis Stream 主要用于消息队列&#xff08;MQ&#xff0c;Message Queue&#xff09;&#xf…

【Spring】— Spring MVC入门

目录 Spring MVC入门1.Spring MVC概述2.案例——第一个Spring MVC应用1.创建项目&#xff0c;引入JAR包2.配置前端控制器3.创建Controller类4.创建Spring MVC的配置文件&#xff0c;配置控制器映射信息5.创建视图&#xff08;View&#xff09;页面6.启动项目&#xff0c;测试应…

Axios异步调用

promise 主要解决异步深层嵌套的问题 promise 提供了简洁的API 使得异步操作更加容易 1. Promise 基本API //实例方法 .then() //得到异步任务正确的结果 .catch() //获取异常信息 .finally() //成功与否都会执行&#xff08;不是正式标准&#xff09; 2. axios基本使用 …

window服务器环境将springboot项目 jar包注册成一个window服务自启动

目录 1.下载WinSW工具 2.新建一个Window Service信息的xml文件 3.将xml和exe重命名 4.安装卸载服务 5.修改配置文件 6.常用命令(注意winsw是exe名字 1.下载WinSW工具 下载winswhttps://github.com/winsw/winsw/releases 2.新建一个Window Service信息的xml文件 <!--…

OpenCV 笔记_3

文章目录 笔记_3直方图匹配(直方图规定化) 主要针对单通道图像模板匹配matchTemplate 模板匹配函数 图像卷积filter2D 卷积函数 过滤器图像噪声的产生cvflann::rand_double 产生随机浮点数在&#xff08;0~1&#xff09;之间cvflann::rand_int 产生随机整数在&#xff08;0~RAN…

最受欢迎的项目管理软件大揭秘!

项目管理软件是现代化项目管理的重要工具。这种软件可以帮助管理项目进度、资源、预算等方面的事项&#xff0c;以及项目团队之间的沟通和协作。目前市面上有很多不同的项目管理软件&#xff0c;如&#xff1a;Zoho Projects、Wrike、Asana、Trello、Basecamp、Jira等等。然而&…

操作系统-文件管理-文件系统基础

目录 一、文件的概念 文件地属性 文件的基本操作 二、文件的逻辑结构 2.1顺序文件 2.2索引文件 2.3索引顺序文件 2.4文件的目录 2.4.1文件控制块FCB 2.4.2目录结构 2.4.3索引结点(FCB改进) 三、文件保护 3.1口令保护 3.2加密保护 3.3访问控制 四、物理结构 4.1连…

操作系统-文件管理-文件系统管理和结构

目录 一、文件存储空间管理 存储空间的划分和初始化 1.1空闲表法 1.2空闲链表法 1.3位示图法 1.4成组链接法 二、文件共享 2.1基于索引结点的共享方式(硬链接) 2.2基于符号链的共享方式(软链接) 三、文件系统的层次结构 四、文件系统的全局结构 五、虚拟文件系统 文件…

自定义阿里云OSS上传文件的start依赖

说明&#xff1a;SpringBoot项目之所以开发起来很方便&#xff0c;是因为SpringBoot项目在启动时自动为我们装配了很多Bean对象&#xff08;参考&#xff1a;http://t.csdn.cn/MddMO&#xff09;&#xff0c;这取决于我们是否在pom.xml文件添加对应的依赖&#xff0c;称为起步依…

【ARIMA-LSTM】合差分自回归移动平均方法-长短期记忆神经网络研究(Python代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

MySQL - 第3节 - MySQL表的操作

1.创建表 创建表的SQL如下&#xff1a; CREATE TABLE [IF NOT EXISTS] table_name(field1 datatype1 [COMMENT 注释信息],field2 datatype2 [COMMENT 注释信息],field3 datatype3 [COMMENT 注释信息] )[CHARSETcharset_name] [COLLATEcollation_name] [ENGINEengine_name];说明…

springCloudAlibaba组件-Nacos-功能概述与配置(一)

文章目录 概述使用方式Nacos的关键特性 概述 一个更易于构建云原生应用的动态服务发现&#xff08;所有的微服务都注册到nacos中&#xff0c;微服务通过nacos服务中心进行服务发现&#xff09;、配置管理(主要将公共的服务配置&#xff08;如连接redis、mysql)在一个配置文件中…

【c语言初阶】操作符全面知识总结

操作符详解 操作符种类算术操作符移位操作符位操作符编程题&#xff1a;两数交换多种解法编程题&#xff1a;求一个数在内存中二进制数1的个数赋值操作符单目操作符关系操作符编程题&#xff1a;谁是凶手逻辑操作符一道笔试题条件操作符逗号表达式下标引用、函数调用和结构体成…

响应式编程理论篇:源码浅析WebClient

1 缘起 WebFlux系统中&#xff0c;如何请求第三方或其他内部兄弟系统提供的接口&#xff1f; 当然&#xff0c;可以直接使用OKhttp/Apache HttpClient/SpringMVC RestTemplate&#xff0c; 在WebFlux中同样提供了请求接口的工具&#xff1a;WebClient&#xff0c; 本篇文章主要…

03单链表及代码实现

链表介绍&#xff08;Linked List&#xff09; 链表是有序列表&#xff0c;存储方式如下图&#xff08;物理结构图&#xff09; 链表小结 链表是以结点的方式来存储的。链式存储。每个结点包含data域、next域&#xff08;指向下一个结点&#xff09;。要注意的是&#xff0…

阿里云服务器适用于哪些业务场景?有哪些行业的客户在使用?

阿里云服务器适用于哪些业务场景&#xff1f;有哪些行业的客户在使用&#xff1f;    阿里云服务器的主要业务场景   阿里云服务器能够满足各种业务场景的需求&#xff0c;具有高性能、易扩展、安全可靠等特点。下面我们将详细介绍阿里云服务器适用于哪些业务场景。 Web应用…

JUC并发编程初学

什么是JUC进程和线程回顾Lock锁生产者和消费者8锁的线程集合类不安全CallableCountDownLatch、CyclicBarrier、Semaphore读写锁阻塞队列线程池四大函数式接口Stream流式计算分支合并异步回调JMMvolatile深入单例模式深入理解CAS原子引用可重入锁、公平锁非公平锁、自旋锁、死锁…