TensorFlow基础--实现激励函数

激励函数是实现机器学习特别是神经网络算法的必备神器。激励函数的目的是为了调节权重和误差。

在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()








猜你喜欢

转载自blog.csdn.net/u010936286/article/details/80703363