激励函数是实现机器学习特别是神经网络算法的必备神器。激励函数的目的是为了调节权重和误差。
在TensorFlow中,激励函数是作用于张量上的非线性操作。
下面我们给出常用的几种激励函数
首先引入TensorFlow包并创建计算图
import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt
sess = tf.Session()
TensorFlow激励函数位于神经网络(neural network,nn)库中,当然我们也可以通过TensorFlow或者numpy等自行设计激励函数。
1.整流线性单元(Rectifier Linear unit,ReLU)是神经网络最常用的非线性函数,其函数表达式为:y = max(0,x)
print('整流线性单元'.center(50,'-'))
print(sess.run(tf.nn.relu([-3,3.0,10.0])))
其结果为[ 0. 3. 10.]
2.ReLU6
ReLU6表示为 y = min(max(0,x),6),其作用是为了抵消ReLU激励函数的线性增长部分,使其值小于等于6
print(sess.run(tf.nn.relu6([-3,3.0,10.0])))
其结果为[ 0. 3. 6.]
3.sigmoid函数
sigmoid函数是最常用的连续、平滑的激励函数,也被称为逻辑函数(Logistic函数),其表示为:y=1/(1+exp(-x))
由于sigmoid函数常使深度学习网络梯度消失从而无法使网络更深,因此不常使用
print('sigmoid'.center(50,'-'))
print(sess.run(tf.nn.sigmoid([-1.0,0.0,1.0])))
其结果为:
---------------------sigmoid----------------------
[ 0.26894143 0.5 0.7310586 ]
4.双曲正切函数(hyper tangent,tanh)
双曲正切函数与sigmoid函数相似,但其取值范围不同,tanh范围为-1到1,sigmoid为0到1,其可以表示为:
(exp(x)-exp(-x))/(exp(x)+exp(-x))
print('双曲正切函数'.center(50,'-'))
print(sess.run(tf.nn.tanh([-1.0,0.0,1.0])))
其结果为:
----------------------双曲正切函数----------------------
[-0.76159418 0. 0.76159418]
5.softsign函数
softsign函数表示为x/(abs(x)+1),它是符号函数的连续估计
print('softsign'.center(50,'-'))
print(sess.run(tf.nn.softsign([-1.0,0.0,1.0])))
其结果为:
---------------------softsign---------------------
[-0.5 0. 0.5]
6.softplus函数
softplus函数是ReLU的平滑版,其表达式为log(exp(x)+1)
print('softplus'.center(50,'-'))
print(sess.run(tf.nn.softplus([-1.0,0.0,1.0])))
其结果为:
---------------------softplus---------------------
[ 0.31326166 0.69314718 1.31326163]
7.ELU激励函数
ELU激励函数与softplut类似,区别在于当输入无限小时,其值趋近于-1,而softplut为0
其表达式为:
y = exp(x)-1 (x<0)
y = x (x>=0)
print('ELU'.center(50,'-'))
print(sess.run(tf.nn.elu([-1.0,0.0,1.0])))
其结果为:
-----------------------ELU------------------------
[-0.63212055 0. 1. ]
现在我们将上述几种激励函数画出来以形象表示:
这里x取值为-10到10,通过sess.run得到各个激励函数的取值
我们通过matplotlib画出函数图像
x = np.linspace(start=-10,stop=10,num=50)
y1 = sess.run(tf.nn.softplus(x))
print(type(y1))
y2 = sess.run(tf.nn.relu(x))
y3 = sess.run(tf.nn.relu6(x))
y4 = sess.run(tf.nn.elu(x))
y5 = sess.run(tf.nn.sigmoid(x))
y6 = sess.run(tf.nn.tanh(x))
y7 = sess.run(tf.nn.softsign(x))
fig = plt.figure()
fig2 = plt.figure()
ax = fig.add_subplot(111)
ax2 = fig2.add_subplot(111)
ax.plot(x,y1,'-',label='Softplus')
ax.plot(x,y2,'.',label='ReLU')
ax.plot(x,y3,'-.',label='ReLU6')
ax.plot(x,y4,label='ExpLU')
handles,labels = ax.get_legend_handles_labels()
ax.legend(handles,labels)
ax.set_xlabel('x')
ax.set_ylabel('y')
fig.suptitle('figure1')
ax2.plot(x,y5,'-',label='sigmoid')
ax2.plot(x,y6,'.',label='Tanh')
ax2.plot(x,y7,'-.',label='softsign')
handles,labels = ax2.get_legend_handles_labels()
ax2.legend(handles,labels)
plt.show()