浅谈CNN中的激活函数
1. 引言
通常情况下,激活函数往往返回0到1的数值。在神经元中,输入的input经过一系列加权求和后作用于另一个函数,这个函数就是这里的激活函数。激活函数通常由各种各样的种类,但是他们一般的特点在于倒数简单,方便计算可以节省求导和网络训练时间。
2. 常见的激活函数
这里推荐一个有意思的图,使用小人描绘了各种各样的激活函数,如下所示:
接下来,我们从中挑选重要的激活函数由浅入深地进行讲解。
3. 二元阶跃函数
二元阶跃函数是最简单的激活函数之一,它基于这样一个事实:如果求和的结果大于或等于0,则结果为1,如果小于0,则结果为0。
f(x) = 1, x >= 0= 0, x < 0
上述激活函数的图示如下:
4. 线性激活函数
线性激活函数是输出与输入成比例的函数。
该函数对输入的加权和不做任何处理,只返回给定的值。
5. Sigmoid 激活函数
Sigmoid
函数将输入的值转换为(0,1),如果输入是非常小的负数,那么输出就是0;如果输入是非常大的正数,输出就是1。其计算公式如下:
f(x) = 1 / (1 - e^(-x))
该函数图例如下:
同时该激活函数的特点如下:
- 收敛缓慢
- 边界介于0和1之间
- 梯度反向传递时可能会导致梯度消失
我们重点观察其导数图像,如下所示:
上述图像中,梯度值仅在-3到3范围内有效,而该曲线图在其他区域变得非常平坦。这意味着,对于大于3或小于-3的值,函数将具有非常小的梯度。当梯度值接近零时,网络将停止学习,此时将导致梯度消失问题。
6. Tanh 激活函数
双曲正切激活函数将输入的值转换为(-1,1),如果输入是非常小的负数,那么输出就是-1;如果输入是非常大的正数,输出就是1。其计算公式如下:
f(x) = (e^x - e^(-x)) / (e^x + e^(-x))
该函数图例如下:
同时该激活函数的特点如下:
- 输出均值为0,其收敛速度相比sigmoid更快
- 边界基于-1和1之间
- 在循环神经网络中表现良好
我们重点观察其导数图像,如下所示:
观察上图,可以发现该函数依旧面临着类似于sigmoid激活函数梯度消失的问题。同时tanh函数的梯度相比sigmoid函数陡峭得多,梯度消失问题相比sigmoid函数有所缓解。
7. ReLU 激活函数
ReLU激活函数为改进后的线性激活函数,通过取消x<0 即只在输入保留正值来转换输入的值,其计算公式如下:
f(x) = max(0, x) = 0 for x < 0x for x >= 0
样例图像如下:
同时该激活函数的特点如下:
- 稀疏激活,仅在x>0时进行激活
- 没有上边界
- 梯度值在x<0是为零。由于这个原因,在反向传播过程中,一些神经元的权重和偏差没有更新。该特性对图像表现良好。
- 在卷积网络中表现良好。
- 由于只有一定数量的神经元被激活,与sigmoid和tanh函数相比,ReLU函数的计算效率要高得多。
8. SoftMax 激活函数
Softmax
函数将输出转换为概率形式的表示,使得输出的所有概率之和为1。
在多类分类的情况下,它最常用作神经网络最后一层的激活函数。
SoftMax
激活函数的特点如下:
- 当我们想要以概率的形式输出时,就使用它
- 边界介于0和1之间
- 它用于归一化多类类别预测输出值
- 用于多分类最后一层性能良好
9. 如何选择激活函数
针对不同类型的网络来进行针对性的选择,常用的归纳如下所示:
针对需要解决问题本身来针对性的选择,归纳如下:
10. 总结
本文重点介绍了几种常见的激活函数,并给出了相应的计算公式和图例说明,同时最后针对不同的网络类型和任务类型进行了相应的归纳。
您学废了吗?
关注公众号《AI算法之道》,获取更多AI算法资讯。
浅谈CNN中的激活函数相关推荐
- 激活函数设计vhdl_浅谈神经网络中激活函数的设计
激活函数是神经网络中非线性的来源,因为如果去掉这些函数,那么整个网络就只剩下线性运算,线性运算的复合还是线性运算的,最终的效果只相当于单层的线性模型. 那么,常见的激活函数有哪些呢?或者说,激活函数的 ...
- 浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别
浅谈caffe中train_val.prototxt和deploy.prototxt文件的区别 标签: caffe深度学习CaffeNet 2016-11-02 16:10 1203人阅读 评论(1) ...
- java 中的单元测试_浅谈Java 中的单元测试
单元测试编写 Junit 单元测试框架 对于Java语言而言,其单元测试框架,有Junit和TestNG这两种, 下面是一个典型的JUnit测试类的结构 package com.example.dem ...
- mybatis与php,浅谈mybatis中的#和$的区别
浅谈mybatis中的#和$的区别 发布于 2016-07-30 11:14:47 | 236 次阅读 | 评论: 0 | 来源: 网友投递 MyBatis 基于Java的持久层框架MyBatis 本 ...
- 浅谈CSS3中display属性的Flex布局,关于登陆页面属性框的设置
声明:本文转发自三里屯柯南的浅谈CSS3中display属性的Flex布局http://www.cnblogs.com/xuyuntao/articles/6391728.html 基本概念 采用Fl ...
- python sys模块作用_浅谈Python中的模块
模块 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Mod ...
- python生成器和迭代器作用_浅谈Python中的生成器和迭代器
迭代器 迭代器协议 对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么返回一个异常来终止本次迭代.(只能往前走,不能往后退!) 迭代器对象 遵循了(实现了)迭代器协议的对象.(对象内 ...
- oracle hash join outer,CSS_浅谈Oracle中的三种Join方法,基本概念
Nested loop join:
Outer - phpStudy...
浅谈Oracle中的三种Join方法 基本概念 Nested loop join: Outer table中的每一行与inner table中的相应记录join,类似一个嵌套的循环. Sort mer ...
- python中 是什么类型_浅谈python中的变量默认是什么类型
浅谈python中的变量默认是什么类型 1.type(变量名),输出的结果就是变量的类型: 例如 >>> type(6) 2.在Python里面变量在声明时,不需要指定变量的类型,变 ...
最新文章
- [Linux] PHP程序员玩转Linux系列-Linux和Windows安装nginx
- springboot:thymeleaf
- android fragment 菜单栏,android UI:底部菜单栏的学习与制作——Fragment碎片一
- 语言速算24点的小窍门_期末备考:小学数学期末常考题型汇总+速算解题思路分析...
- activemq网络桥接_ActiveMQ –经纪人网络解释–第2部分
- 25 个精美的后台管理界面模板和布局
- @async 没有异步_玩转javascript异步编程
- 仿百度手机助手标题栏透明度随ListView或ScrollView滚动改变的实现方法
- Oracle物化视图的简单使用
- 安装CLOVER引导器到硬盘EFI分区
- 服务器temp文件夹文件都能清理吗,Temp文件夹是什么?Windows中Temp文件夹下内容可以随意删除吗?...
- 使用Pyecharts进行全国水质TDS地图可视化全过程9:构建字典,批量生成所有省份地图
- 利用百度地图API进行车辆查询并用鼠标拾点获取经纬度
- Socket UDP、TCP 简介
- 护眼灯护眼有效果吗?一文了解护眼灯到底有没有用
- 第一台数字电子计算机占地面积为,中国的第一台计算机占地面积是多少?
- (模电笔记四 By Multisim)典型运算放大电路案例分析(同相反相差分)
- python while true循环卡住不动_python – While循环导致整个程序在Tkinter中崩溃
- 单机版五子棋java功能_JAVA单机版五子棋怎么写
- 计算机设计基础课程设计,设计课程总结范文
热门文章
- 分区助手迁移系统盘到固态,注册表调盘符后出现黑屏问题的解决方案
- 为什么搜狗浏览器打开新网页是后台显示,而不是直接显示新打开
- 利用Pano2VR +PS在全景图中补地以及添加图片
- sqli-lab 6
- ISO管理体系认证 的好处 及对企业的优势
- 干货 | 国际化探索之路-Trip.com如何走进阿拉伯市场
- error:failed to push some refs to ‘ssh://git.....‘
- 尚品汇VUE项目实战相关面试题总结
- 业余程序员余流 - 杂谈 之 《癌症》
- 基于c++实现RTSP/RTMP推流组件PushStream简介