![深度学习:卷积神经网络技术与实践](https://wfqqreader-1252317822.image.myqcloud.com/cover/162/32436162/b_32436162.jpg)
3.3 激活函数
激活函数的作用是增加神经网络的非线性,常用的激活函数有Sigmoid、Relu、Softmax等。下面介绍这几种函数。
3.3.1 Sigmoid函数
在神经网络的搭建中,Sigmoid函数较为常用,其定义如下:
![](https://epubservercos.yuewen.com/9B758C/17517094407487606/epubprivate/OEBPS/Images/43-i.png?sign=1739119991-XB5lKhpV0qn9tRvXl5z8Jo1FwMUuQZ1e-0-c30c1f9802cfa58a6a5db75dba63d8bb)
Sigmoid函数图像如图3-4所示。可以看出Sigmoid函数值在开区间0到1之间,自变量的绝对值越靠近0,函数值变化越快;自变量的绝对值越大,函数值变化越缓慢。
![](https://epubservercos.yuewen.com/9B758C/17517094407487606/epubprivate/OEBPS/Images/t3-4-i.jpg?sign=1739119991-dxOoLIU4zH0ipM6TG4mxDe0qvJLA11o0-0-8d20d5392443c88317a4b80c9f71c4c8)
图3-4 Sigmoid函数图像
基于Keras搭建神经网络时,选择Sigmoid函数,可通过model.add()在指定的Dense层后添加该激活函数。主要语句如下:
model.add(Activation('sigmoid'))
Sigmoid函数可以模仿生物神经元的神经对刺激信号的接收,当神经所接收的刺激程度过小时,可以忽略该刺激信号,即Sigmoid函数输出值接近于0;当神经所接收的刺激程度在正常范围内时,可以接收该刺激信号,即Sigmoid函数输出0~1的函数值;当神经所接收的刺激程度过大时,神经会变得迟钝,维持之前的感觉不变,即Sigmoid函数输出值一直趋近1。
Sigmoid函数也有一些缺点,如在后续提到的神经网络反向传播中,该函数可能会造成梯度消失或梯度饱和;该函数需要进行指数运算,故在训练时运算量较大;该函数图像不是关于原点对称,不利于梯度下降等。
3.3.2 Tanh函数
Tanh函数也是一种常用的S型非线性激活函数,是Sigmoid的变种。其定义如下:
![](https://epubservercos.yuewen.com/9B758C/17517094407487606/epubprivate/OEBPS/Images/43-2-i.png?sign=1739119991-mA6D1ChEL59tFOzuUvtyK5lSHGEYkiZM-0-9d7be4543af7d3b36eb3662f7a7f983b)
Tanh函数图像如图3-5所示。Tanh函数把一个实数压缩至–1到+1之间,对中部区的信号增益较大,对两侧区的信号增益小。它的输出有界,为神经网络带来了非线性。同时Tanh克服了Sigmoid非0均值输出的缺点,延迟了饱和期,拥有更好的容错能力,性能上要优于Sigmoid。但是它存在梯度弥散的问题,而这种缺点是致命的。这也表明,不管是Sigmoid还是Tanh都存在极大的局限性。
![](https://epubservercos.yuewen.com/9B758C/17517094407487606/epubprivate/OEBPS/Images/t3-5-i.jpg?sign=1739119991-kYAJI2Nopm5wUaZhc13iniVkmEUguMGD-0-be09b9809453b4a686226f840e6e0428)
图3-5 Tanh函数图像
3.3.3 Relu函数
Relu函数也较为常用,其定义如下:
![](https://epubservercos.yuewen.com/9B758C/17517094407487606/epubprivate/OEBPS/Images/44-i.png?sign=1739119991-58wtDEv89PwCeCA6ITVI3wywqK10xSNP-0-9023e9213bd95ee32f80376578222836)
Relu函数图像如图3-6所示。只有当自变量值大于等于0时,函数值才有输出,否则为0。类比于生物神经元的神经对刺激信号的接收,当刺激程度小于某临界值时,可忽略不计;当刺激程度大于某临界值时,神经才开始接收该刺激信号。
基于Keras搭建神经网络时,选择Relu函数,可通过model.add()在指定的Dense层后添加该激活函数。主要语句如下:
model.add(Activation('relu'))
相比于Sigmoid函数,Relu函数不会在训练过程中造成梯度饱和,同时由于Relu函数的线性运算,运算速度也要比Sigmoid函数快。由于输入为负、输出为0的性质,在反向传播时,Relu函数也会造成梯度消失。
![](https://epubservercos.yuewen.com/9B758C/17517094407487606/epubprivate/OEBPS/Images/t3-6-i.jpg?sign=1739119991-AAjpb1JUHgO9PPCSOEN7pFpQegrGwuMS-0-1c5b2be55a6263a5c6acd506b3d30d39)
图3-6 Relu函数图像
3.3.4 Softmax函数
Softmax函数常用在输出层,配合输出层完成多分类输出的任务,其定义如下:
![](https://epubservercos.yuewen.com/9B758C/17517094407487606/epubprivate/OEBPS/Images/45-i.png?sign=1739119991-GXq3pnTbxRFxN5SBdqGrkvuvIcpORNiz-0-50830d8af9d4e65173e158b7ffa1610f)
Softmax函数又称为归一化指数函数,其输出值也是归一化的分类概率,可以得到每个类别的概率,范围为(0,1),全部类别概率之和为1。
Sigmoid函数可以把数据映射到(0,1)的区间内,可以用来完成二分类的任务。相比于Sigmoid函数,Softmax函数可以被视为将数据(a1,a2,a3,…)映射为(b1,b2,b3,…),其中bi均为0到1的常数,进而可以根据bi的大小来完成多分类的任务。
基于Keras搭建神经网络时,选择Softmax函数,可通过model.add()在输出层后添加该激活函数。主要语句如下:
model.add(Activation('softmax'))