TensorFlow入门(十八、激活函数)

激活函数是什么?

        单个神经元的网络模型:

        用计算公式表达如下:

        即在神经元中,输入的x通过与权重w相乘,与偏置量b求和后,还被作用了一个函数,这个函数就是激活函数。

激活函数的作用

        如果没有激活函数,整个神经元模型就是一个简单的线性方程。而在现实生活中,线性方程能解决的事情相对比较简单,不能解决很多复杂的问题。比如使用神经网络模型模拟类似图像、视频、音频、语音这样的复杂数据,隐藏层之间存在非线性特点,需要使用激活函数来帮助模型理解并模拟这类数据。

        激活函数对于人工神经网络模型学习、理解非常复杂的非线性函数来说具有十分重要的作用。通过它,可以将非线性因素引入到网络模型中,将模型中一个节点的输入信号转换成一个输出信号,该输出信号被用作下一层的输入,从而解决线性模型表达能力不足的缺陷。

        示意图如下:

        通过前面各输入值x和权重w的求和计算后输出结果,将输出结果作为激活函数的输入,从而增加模型解决负责问题的能力。

激活函数种类

        激活函数有多种,早期研究神经网络主要采用sigmoid函数或者tanh函数,输出有界,很容易充当下一层的输入。近些年Relu函数及其改进型(如Leaky-ReLU、P-ReLU、R-ReLU等)在多层神经网络中应用比较多。

        Sigmoid函数

                Sigmoid函数,也叫Logistic函数,用于隐层神经元输出,该函数的数学公式、函数曲线和导数曲线如下:

                计算公式:

                函数、导数曲线:

                可以看到:Sigmoid函数连续、光滑、严格单调,是一个非常良好的阈值函数。x可以是正无穷到负无穷,但是对应的y却只有0~1的范围,所以,经过Sigmoid函数输出的函数都会落在0~1的区间里,即Sigmoid函数能够把输入的值"压缩"到0~1之间。

                随着x趋近正负无穷大,y对应的值越来越接近1或-1的情况叫做饱和。处于饱和态的激活函数意味着,当x=100和x=1000时的反映都是一样的,这样的特性转换相当于将1000大于100十倍这个信息给丢失了。为了能有效使用Sigmoid函数,x的极限也只能是-6~6之间,而在-3~3之间时应该会有比较好的效果。由于Sigmoid函数的值域范围限制在(0,1)之间,这和概率值的范围[0,1]很接近,所以二分类的概率常常用这个函数。

                优点 : ①平滑②易于求导

                缺点 : ①在深度神经网络中梯度反向传递时导致梯度爆炸和梯度消失,其中梯度爆炸发生的概率非常小,而梯度消失发生的概率比较大

                          ②Sigmoid的output不是0均值,即不以(0,0)为中心点。这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入,会产生一个结果,即当x>0,f=(w^T)x+b时,对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,从而产生捆绑的现象,使得收敛速度比较缓慢

                          ③其解析式中含有幂运算,计算机求解时相对来讲比较耗时。对于规模比较大的深度网络,这会较大地增加训练时间。

                在TensorFlow中对应的函数为:tf.nn.sigmoid(x,name = None),其中nn代表TensorFlow用于深度学习计算的核心模块。

模拟Sigmoid函数示例代码如下:

import matplotlib.pyplot as plt
import numpy as npdef sigmoid(x):return 1./(1. + np.exp(-x))def plot_sigmoid():x = np.arange(-6,6,0.2)y = sigmoid(x)plt.plot(x,y)plt.show()if __name__ == "__main__":plot_sigmoid()

        Tanh函数

                Tanh函数,也叫双曲正切函数。该函数在Sigmoid函数值域范围(0~1)的基础上,将值域范围升级到了-1~1,可以说是Sigmoid函数的值域升级版。

                计算公式:

                函数、导数曲线:

                可以看到,x取值也是从正无穷到负无穷,但对应的y值变为-1~1之间,相对于Sigmoid函数有了更广的值域。Tanh函数在特征相差明显时的效果会很好,在循环过程中会不断扩大特征效果。但是,Tanh函数跟Sigmoid函数有一样的缺陷,即饱和问题,所以在使用Tanh函数时,要注意输入值的绝对值不能过大,否则模型无法训练。

                优点 : ①Tanh函数的导数比Sigmoid函数的导数数值更大,即梯度变化更快,在训练过程中收敛速度更快

                          ②输出范围为-1到1之间,可以使得输出均值为0,即以(0,0)为中心点,这个性质可以提高BP训练的效率

                          ③可以将线性函数转变为非线性函数

                缺点 : ①也存在梯度消失的情况,并没有解决Sigmoid梯度消失的问题

                          ②幂运算依然比较耗时

                在TensorFlow中对应的函数为:tf.nn.tanh(x,name = None)

模拟Tanh函数示例代码如下:

import matplotlib.pyplot as plt
import numpy as npdef tanh(x):return (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))tanh_inputs = np.arange(-10,10,0.1)
tanh_outputs = tanh(tanh_inputs)plt.plot(tanh_inputs,tanh_outputs)
plt.xlabel("Tanh Inputs")
plt.ylabel("Tanh Outputs")
plt.show()

        ReLU函数

                ReLU函数,即线性整流函数,又称修正线性单元。

                计算公式:

                函数曲线:

                可以看到,ReLU函数对正向信号非常重视,忽略了负向信号。与人类神经元细胞对信号的反映很是类似。因此在神经网络中可以取得很好的拟合效果,应用十分广泛。

                优点 : ①收敛速度比Sigmoid函数和Tanh函数快,解决了梯度爆炸、梯度消失的问题

                          ②计算复杂度低,大大地提升了机器的运行效率

                          ③适合用于后向传播

                缺点 : ①ReLU的输出不是以(0,0)为中心点

                          ②改动了输入数据的分布,下一层输入数据的分布跟前一层输入数据的分布不同,大大降低了模型的训练速度

                          ③ReLU不会对数据做幅度压缩,数据的幅度会随着模型层数的增加不断扩张

                          ④容易出现神经元死亡的问题,当输入接近零或为负时,函数的梯度变为零,网络将无法执行反向传播,也无法学习

                在TensorFlow中,关于ReLU函数的实现,有以下两个对应的函数

                        tf.nn.relu(features,name = None),它是一般的ReLU函数,即max(features,0)

                        tf.nn.relu6(features,name = None),它是以6为阈值的ReLU函数,即min(max(features,0),6)

                        注意 : relu6存在的原因是防止梯度爆炸,当节点和层数特别多而且输出都为正时,它们相加后的和会是一个很大的值,尤其在经历几层变换之后,最终的值可能会离目标值相差太远,误差太大,会导致对参数调整修正值过大,从而引起网络抖动得较厉害,最终很难收敛。

        Softplus函数

                Softplus函数与ReLU函数十分类似,具体的函数曲线为下图中的蓝色虚线:

                Softplus函数与ReLU函数的区别在于 : Softplus函数更加平滑,但是计算量很大,而且对于小于0的值保留的相对更多一点。

                Softplus函数的计算公式:

                在TensorFlow中,对应的函数为:tf.nn.softplus(features,name = None)

        基于ReLU基础上的变种函数

                从ReLU函数的曲线上知道,它在正向传播方面对信号的响应有很多优势,但忽略了负向信号,全部舍去了负值,很容易使模型输出全零导致无法再进行训练。例如,随机初始化的w中有个值是负值,相乘之后为负值,尽管对应的输入是正值,但输入值特征也会被全部屏蔽。同理,对应负值输入值反而被激活了。这显然不是我们想要的结果。于是在基于ReLU的基础上又演化出了一些变种函数。

                Noisy relus函数 : 它为max中的x加了一个高斯分布的噪声,数学公式如下:

                        

                Leaky relus函数 : 它在ReLU基础上,保留一部分负值,让x为负时乘0.01,即Leaky relus对负信号不是一味地拒绝,而是缩小。其数学公式如下:

                        

                        可以进一步让这个0.01作为参数可调,于是,当x小于0时,乘以a,a小于等于1。数学公式变为:

                        

                        可以得到Leaky relus的公式为max(x,ax)

                        Leaky relus的函数曲线:

                        在TensorFlow中,Leaky relus公式没有专门的函数,可以利用现有函数组成而得到:tf.maximum(x,leak * x,name = name),其中leak为传入的参数,可以设为0.01等。

                Elus函数 : Elus函数与ReLU函数一样都是不带参数的,而且收敛速度比ReLU函数更快,使用Elus函数时,不使用批处理比使用批处理能够获得更好的效果,同时Elus函数不使用批处理的效果比ReLU函数加批处理的效果要好。

                        数学公式:

                        在TensorFlow中,Elus函数对应的函数为:tf.nn.elu(features,name = None)

                Swish函数 : 谷歌公司发现的一个效果更优于Relu的激活函数。经过测试,在保持所有的模型参数不变的情况下,只是把原来模型中的ReLU激活函数修改为Swish激活函数,模型的准确率具有提升。

                        数学公式:

                        其中β为x的缩放参数,一般情况下取默认值1即可,在使用BN算法的情况下,还需要对x的缩放值β进行调整。β是个常数或可训练的参数。Swish具备无上界有下界、平滑、非单调的特性。Swish在深层模型上的效果优于ReLU。

                        在TensorFlow低版本中没有单独的Swish函数,可以手动封装,代码如下:

def swish(x,beta = 1):return x*tf.nn.sigmoid(x*beta)

                        当beta去不同的值时,函数图像如下:

                                

                        当β = 0时,Swish激活函数变为线性函数f(x) = x/2

                        当β = ∞时,Swish激活函数变为0或x,相当于ReLU

                        所以,Swish函数可以看作是介于线性函数与ReLU函数之间的平滑函数

激活函数总结

        ①神经网络中,运算特征是不断进行循环计算的,每个神经元的值也是在不断变化中。当特征相差明显时,Tanh函数的效果会很好,在循环过程中会不断扩大特征效果并显示出来。

        ②当计算的特征间相差虽较复杂却没有明显的区别,或者特征间的相差不是特别大时,需要更细微的分类判断,这时sigmoid函数的效果会好一些。

        ③ReLU函数的优势在于,其处理后的数据具备更好的稀疏性,即:将数据转化为只有最大数值.其他都为0,这种变换可以近似程度地最大保留数据特征,用大多数元素为0的稀疏矩阵来实现。以稀疏性数据来表达原有数据特征的方法,使得神经网络在迭代运算中能够取得又快又好的效果,因此目前大多数用max(0,x)来代替Sigmoid函数。

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

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

相关文章

超简单的视频截取方法,迅速提取所需片段!

“视频可以截取吗?用相机拍摄了一段视频,但是中途相机发生了故障,录进去了很多不需要的片段,现在想截取一部分视频出来,但是不知道方法,想问问广大的网友,知不知道视频截取的方法。” 无论是工…

2023年中国牙线市场规模、竞争现状及行业需求前景分析[图]

牙线是由合成纤维或其他材料制成,或添加香料、色素、活性成分等,用来清洁牙齿邻面附着物的线。能够有效包裹牙齿,对于清洁平面/凸起牙面和牙齿邻接面的牙菌斑效果很好,还可以实现对于牙缝间食物/异物的剔除,有效清洁口…

linux后台运行java项目/ jar包:nohup 命令

1.提出问题 我们把一个 SpringBoot 工程导出为 jar 包,jar 包上传到阿里云 ECS 服务器上,使用 java -jar xxx-xxx.jar 命令启动这个 SpringBoot 程序。此时我们本地的 xshell 客户端必须一直开着,一旦 xshell 客户端关闭,java -j…

CPU性能分析--火焰图使用

记录工具使用说明,火焰图原理网上分析很多。主要用来分析函数调用栈占用的cpu利用率,分析函数性能。 perf安装: sudo apt-get install linux-tools-common sudo apt-get install linux-tools-"(uname -r)" sudo apt-get install …

基于FPGA的图像形态学腐蚀算法实现,包括tb测试文件和MATLAB辅助验证

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的仿真结果导入到MATLAB,结果如下所示: 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps…

微服务必学!RedisSearch终极使用指南,你值得拥有!

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是尘缘,一个在CSDN分享笔记的博主。📚📚 👉点击这里,就可以查看我的主页啦!👇&#x…

基于乌燕鸥优化的BP神经网络(分类应用) - 附代码

基于乌燕鸥优化的BP神经网络(分类应用) - 附代码 文章目录 基于乌燕鸥优化的BP神经网络(分类应用) - 附代码1.鸢尾花iris数据介绍2.数据集整理3.乌燕鸥优化BP神经网络3.1 BP神经网络参数设置3.2 乌燕鸥算法应用 4.测试结果&#x…

机器学习、深度学习相关的项目集合【自行选择即可】

【基于YOLOv5的瓷砖瑕疵检测系统】 YOLOv5是一种目标检测算法,它是YOLO(You Only Look Once)系列模型的进化版本。YOLOv5是由Ultralytics开发的,基于一阶段目标检测的概念。其目标是在保持高准确率的同时提高目标检测的速度和效率…

Python并发编程简介

1、Python对并发编程的支持 多线程: threading, 利用CPU和IO可以同时执行的原理,让CPU不会干巴巴等待IO完成多进程: multiprocessing, 利用多核CPU的能力,真正的并行执行任务异步IO: asyncio,在单线程利用CPU和IO同时执行的原理,实现函数异步执行使用Lo…

Altium如何查看导线长度?凡亿悄悄地告诉你

Altium Designer(AD)是全球应用最广泛的EDA工具之一,它提供了一套完整的解决方案,从原理图设计、模拟、PCB布局和布线,到最后的Gerber输出,都可在该平台上完成,因此是很多电子工程师的必学软件之…

Java学数据结构(4)——PriorityQueue(优先队列) 二叉堆(binary heap)

前言 数据结构与算法作为计算机科学的基础,是一个重点和难点,在实际编程中似乎看不它们的身影,但是它们有随处不在,如影随形。 本系列博客是《数据结构与算法分析—Java语言描述》的读书笔记,合集文章列表如下&#…

【开发日记】Docker搭建Maven私服

文章目录 前言1、拉取镜像2、创建本地目录3、启动容器4、访问5、上传依赖6、项目配置私服 前言 Maven私服是一种特殊的远程仓库,它是架设在局域网内的仓库服务,用来代理位于外部的远程仓库(中央仓库、其他远程公共仓库)。 在公司…

docker 部署 xxl-job SpringBoot 整合 xxl-job 执行任务

概述 XXL-JOB是一个轻量级的分布式任务调度平台,具有以下特点: 调度模块:负责管理调度信息,发出调度请求,支持可视化和动态的操作,监控调度结果和日志,支持执行器Failover 执行模块&#xff1…

【axmol-2.1 vs cocos2dx性能备忘】

axmol-2.1-08c0605 cocos2d-x-4.0 cocos2d-x-3.17.1 结论 从多边形Sprite渲染性能测试用例看,axmol相对于cocos2d-x-4.0提升42%, 相对于cocos2d-x-3.17.1提升30.8%

mysql面试题35:MySQL有关权限的表有哪些?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL有关权限的表有哪些? MySQL中与权限相关的表主要包括以下几个: user表:存储MySQL用户的基本信息,包括用户名、密码等。可以使用以下命令…

CPU的执行流程

CPU的执行流程 取指令(Instruction Fetch):CPU 从程序存储器(通常是内存)中获取要执行的下一条指令。这个过程包括以下步骤: CPU 从程序计数器(Program Counter,PC)中获…

chromium线程模型(1)-普通线程实现(ui和io线程)

通过chromium 官方文档,线程和任务一节我们可以知道 ,chromium有两类线程,一类是普通线程,最典型的就是io线程和ui线程。 另一类是 线程池线程。 今天我们先分析普通线程的实现,下一篇文章分析线程池的实现。&#xff…

2023年危险化学品经营单位主要负责人证考试题库及危险化学品经营单位主要负责人试题解析

题库来源:安全生产模拟考试一点通公众号小程序 2023年危险化学品经营单位主要负责人证考试题库及危险化学品经营单位主要负责人试题解析是安全生产模拟考试一点通结合(安监局)特种作业人员操作证考试大纲和(质检局)特…

接口测试及常用接口测试工具

首先,什么是接口呢? 接口一般来说有两种,一种是程序内部的接口,一种是系统对外的接口。 系统对外的接口:比如你要从别的网站或服务器上获取资源或信息,别人肯定不会把数据库共享给你,他只能给你…

dbeaver 插入别名设置禁用

1,前提 最近换了一个数据库连接工具,初次使用,非常别扭。 2,问题 首先遇到的第一个问题是 每次输入from table时,后面就会自动添加一个表别名 tt,然后语句就变成这样 from table tt ,所以每次…