神经网络中激活函数发挥着非常重要的作用,在处理简单的线性可分的数据集的时候我们不需要用到激活函数仅仅依靠线性分类器就可以解决问题,但是实际生活中的绝大多数的场景并不是这样简单的,那么简单的线性分类器就没有办法起到很好的效果了,此时常用的处理手段有两种:

1、借助于转化策略将低维空间线性不可分的数据映射到高维空间中,使得其变得线性可分,此时依旧可以基于线性分类器完成建模处理,例如:SVM就是这样的策略

2、引入激活函数,让模型能够学习非线性的复杂映射关系,这样得到的模型也能够处理复杂的问题。一个好的激活函数能够提升模型的表达能力。

今天我不是在这里花时间来讲解什么是激活函数,或者是激活函数主要是用来做什么的?或者是激活函数是怎么实现这样的功能的。今天主要是花一点时间,对自己平时工作中使用到的或者是接触到的激活函数做一个简单的总结,以便于后续的复习等工作,一些比较重要的激活函数以及相应的导函数曲线和取值范围对于从事深度学习等工作的人来说还是很有必要去学习掌握好的,所以今天就来总结学习记录一下,不一定面面俱到,欢迎感兴趣的人来补充。

本篇博客的内容主要总结了8种激活函数,分别为:sigmoid,tanh,relu,leakyrelu,elu,softplus,softsign,selu。下面我们先来分别看一下各个激活函数对应的曲线以及导函数曲线:

1、sigmoid激活函数

2、tanh激活函数

3、relu激活函数

4、leakyrelu激活函数

5、elu激活函数

6、softplus激活函数

7、softsign激活函数

8、selu激活函数

从上面单个激活函数与其导函数曲线上我们对于激活函数的形状有一个比较清晰直观的了解了,接下来,为了方便对比各个激活函数,我们将其绘制在同一幅图像中,具体如下:

不同的激活函数都有其特定的使用场景,以及优缺点,新的激活函数往往是基于某个激活函数的不足进行的改进而提出的,目的都是为了更好地实现神经网络模型的训练优化达到更好的效果。

下面是上述数据的具体实现:

#!usr/bin/env python
# encoding:utf-8
from __future__ import division"""
__Author__:沂水寒城
功能: Python实现神经网络中常用激活函数曲线与导函数曲线绘制
激活函数的作用:激活函数向神经元中引入了非线性因素,使得神经网络可以逼近任意非线性函数,能应用到诸多非线性场景中。
"""import numpy as np
import matplotlib.pyplot as plt
color_list=['#CD853F','#DC143C','#00FF7F','#FF6347','#8B008B','#00FFFF','#0000FF','#8B0000','#FF8C00','#1E90FF','#00FF00','#FFD700','#008080','#008B8B','#8A2BE2','#228B22','#FA8072','#808080']def tanh(x):'''定义tanh函数'''return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))def tanhDerivative(x):'''定义tanh导函数'''return 1-tanh(x)*tanh(x)def sigmoid(x):'''定义sigmoid函数'''return 1.0/(1.0+np.exp(-x))def sigmoidDerivative(x):'''定义sigmoid导函数'''return sigmoid(x)*(1-sigmoid(x))def relu(x):'''定义relu函数'''return np.where(x<0,0,x)def reluDerivative(x):'''定义relu的导函数'''return np.where(x<0,0,1)def leakyrelu(x,a=0.01):'''定义leakyrelu函数leakyrelu激活函数是relu的衍变版本,主要就是为了解决relu输出为0的问题'''return np.where(x<0,a*x,x)def leakyreluDerivative(x,a=0.01):'''定义leakyrelu导函数'''return np.where(x<0,a,1)def elu(x,a=0.01):'''定义elu函数elu和relu的区别在负区间,relu输出为0,而elu输出会逐渐接近-α,更具鲁棒性。elu激活函数另一优点是它将输出值的均值控制为0(这一点确实和BN很像,BN将分布控制到均值为0,标准差为1)'''return np.where(x<0,a*(np.exp(x)-1),x)def eluDerivative(x,a=0.01):'''定义elu导函数'''return np.where(x<0,a*np.exp(x),1)def softplus(x):'''定义softplus函数'''return np.log(np.exp(x)+1)def softplusDerivative(x):'''定义softplus导函数'''return sigmoid(x)def softsign(x):'''定义softsign函数'''return x/(np.abs(x)+1)def softsignDerivative(x):'''定义softsign导函数'''return 1/(1+abs(x)*abs(x))def selu(x):'''定义selu函数'''alpha=1.6732632423543772848170429916717scale=1.0507009873554804934193349852946return np.where(x<0,scale*alpha*(np.exp(x)-1),scale*x)def seluDerivative(x):'''定义selu导函数'''alpha=1.6732632423543772848170429916717scale=1.0507009873554804934193349852946return np.where(x<0,alpha*np.exp(x),scale)def allFuncPloter(start=-10,end=10,save_path='tanh.png'):'''所有激活函数曲线绘制'''x=np.arange(start,end,0.1)y1,y11=sigmoid(x),sigmoidDerivative(x)y2,y22=tanh(x),tanhDerivative(x)y3,y33=relu(x),reluDerivative(x)y4,y44=leakyrelu(x,a=0.01),leakyreluDerivative(x)y5,y55=elu(x,a=0.01),eluDerivative(x)y6,y66=softplus(x),softplusDerivative(x)y7,y77=softsign(x),softsignDerivative(x)y8,y88=selu(x),seluDerivative(x)data=[[y1,y11],[y2,y22],[y3,y33],[y4,y44],[y5,y55],[y6,y66],[y7,y77],[y8,y88]]label=['sigmoid','tanh','relu','leakyrelu','elu','softplus','softsign','selu']plt.clf()plt.figure(figsize=(10,8))for i in range(len(data)):plt.plot(x,data[i][0],label=label[i],c=color_list[i])plt.plot(x,data[i][1],label=label[i]+'Derivative',c=color_list[i])plt.legend(loc='best',ncol=2)plt.savefig(save_path)def singleFuncPloter(start=-10,end=10,name='tanh'):'''单个指定激活函数曲线绘制'''x=np.arange(start,end,0.1)y1,y11=sigmoid(x),sigmoidDerivative(x)y2,y22=tanh(x),tanhDerivative(x)y3,y33=relu(x),reluDerivative(x)y4,y44=leakyrelu(x,a=0.01),leakyreluDerivative(x)y5,y55=elu(x,a=0.01),eluDerivative(x)y6,y66=softplus(x),softplusDerivative(x)y7,y77=softsign(x),softsignDerivative(x)y8,y88=selu(x),seluDerivative(x)data=[[y1,y11],[y2,y22],[y3,y33],[y4,y44],[y5,y55],[y6,y66],[y7,y77],[y8,y88]]label=['sigmoid','tanh','relu','leakyrelu','elu','softplus','softsign','selu']plt.clf()#plt.figure(figsize=(10,8))i=label.index(name)plt.plot(x,data[i][0],label=label[i],c=color_list[i])plt.plot(x,data[i][1],label=label[i]+'Derivative',c=color_list[i+1])plt.legend(loc='best',ncol=2)plt.savefig(name+'.png')if __name__ == '__main__':allFuncPloter(start=-10,end=10,save_path='all.png')for name in ['sigmoid','tanh','relu','leakyrelu','elu','softplus','softsign','selu']:singleFuncPloter(start=-10,end=10,name=name)

学习记录一下,备忘!

神经网络中常用激活函数总结【Python实现激活函数与导函数,曲线可视化分析】相关推荐

  1. CNN之性能指标:卷积神经网络中常用的性能指标(IOU/AP/mAP、混淆矩阵)简介、使用方法之详细攻略

    CNN之性能指标:卷积神经网络中常用的性能指标(IOU/AP/mAP.混淆矩阵)简介.使用方法之详细攻略 目录 CNN中常用的性能指标(IOU/AP/mAP.混淆矩阵)简介 IOU 1.IOU简介 2 ...

  2. python计算商品总价_GitHub - ideaOzy/data_analysis: 基于Python的南京二手房数据采集及可视化分析...

    基于Python的南京二手房数据采集及可视化分析 1 内容简介 首先通过爬虫采集链家网上所有南京二手房的房源数据,并对采集到的数据进行清洗:然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的 ...

  3. Python爬取天气数据及可视化分析!

    来源丨Python之王 Python爬取天气数据及可视化分析 说在前面 天气预报我们每天都会关注,我们可以根据未来的天气增减衣物.安排出行,每天的气温.风速风向.相对湿度.空气质量等成为关注的焦点.本 ...

  4. 基于Python的微信朋友圈数据可视化分析之地点

    前提 朋友圈的相关数据请参照上一篇文章<基于Python的微信朋友圈数据可视化分析之个性签名>获取,本篇文章默认需要的数据已经下载保存至本地的 csv 文件中了. 将好友的地点按照省份进行 ...

  5. Python爬虫项目之NBA球员可视化分析

    Python爬虫学习之NBA球员可视化分析 前言 最近刚上完Python选修课,一直挺喜欢Python的,觉得Python的简洁优美的代码像是在写诗一样让人看了赏心悦目,其次就是他强大的第三方库是其他 ...

  6. Python爬取天气数据及可视化分析

    Python爬取天气数据及可视化分析 文章目录 Python爬取天气数据及可视化分析 说在前面 1.数据获取 请求网站链接 提取有用信息 保存csv文件 2.可视化分析 当天温度变化曲线图 当天相对湿 ...

  7. 数据清洗python实现箱线图_GitHub - nonefirst/data_analysis: 基于Python的南京二手房数据采集及可视化分析...

    基于Python的南京二手房数据采集及可视化分析 1 内容简介 首先通过爬虫采集链家网上所有南京二手房的房源数据,并对采集到的数据进行清洗:然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的 ...

  8. python网页结构分析_GitHub - Vogdhsaj/data_analysis: 基于Python的南京二手房数据采集及可视化分析...

    基于Python的南京二手房数据采集及可视化分析 1 内容简介 首先通过爬虫采集链家网上所有南京二手房的房源数据,并对采集到的数据进行清洗:然后,对清洗后的数据进行可视化分析,探索隐藏在大量数据背后的 ...

  9. python朋友圈数据分析_基于Python的微信朋友圈数据可视化分析之地点

    前提 朋友圈的相关数据请参照上一篇文章<基于Python的微信朋友圈数据可视化分析之个性签名>获取,本篇文章默认需要的数据已经下载保存至本地的 csv 文件中了. 将好友的地点按照省份进行 ...

  10. 【毕业设计_课程设计】基于Python的南京二手房数据采集及可视化分析

    文章目录 0 项目说明 1 内容简介 2 应用技术介绍 3 数据采集 3.1 数据清洗 4 数据可视化 5 项目工程 0 项目说明 基于Python的南京二手房数据采集及可视化分析 提示:适合用于课程 ...

最新文章

  1. [svc]磁盘接口与RAID
  2. linux wm虚拟机网络,复制多台虚拟机及简单的网络配置
  3. C语言用指针求两个矩阵的差,求破C语言用指针和函数求转置矩阵
  4. 【Grafana】开启匿名登录(anonymous login)注意的地方
  5. eclipse 导入maven项目_手把手的Spring Boot Web 项目教程,Hello Spring Boot
  6. Elasticsearch之需要注意的问题(es和jdk版本)
  7. Android实现高仿QQ附近的人搜索展示
  8. 第五届大数据科学与工程国际会议(BDSE2021)如约而至!大咖云集,欢迎参加~
  9. eclipse启动速度等优化设置
  10. JavaSE----多态
  11. 第五步_安装编译必须的软件包依赖包
  12. 蓝墨云班课php答案,蓝墨云班课试题库答案
  13. POI介绍及视频教程
  14. matlab模糊pid控制教程,基于Matlab的自适应模糊PID控制器的设计
  15. 首发创新微信聊天内容制作生成器微信小程序源码下载支持多种制作
  16. java基础巩固-宇宙第一AiYWM:为了维持生计,单例模式阅读总结【单例模式不同写法、在JDK中的应用】~整起
  17. 如何绘制用户体验地图
  18. javascript基础-抢购器与双色球模拟摇奖器
  19. Quill编辑器内置样式配置
  20. 守望你的幸福,也是一种美好:QQ情感日志

热门文章

  1. zabbix修改和查看登录密码
  2. zabbix3.2监控linux内存
  3. JAX-RPC学习笔记(1)-Hello World!
  4. 在Exchange Server 2007中修改邮件接受域
  5. javabean 是什么?
  6. 洛谷.5283.[十二省联考2019]异或粽子(可持久化Trie 堆)
  7. 【剑指Offer】15顺时针打印矩阵
  8. 【机器学习课程笔记(吴恩达)】2.2 代价函数
  9. 如何给网站添加rss功能
  10. linux es数据库 head,Elasticsearch可视化插件ES-HEAD安装启动步骤