第一种:阶跃函数(即不是0就是1)
由于参数x只能接受实数(浮点型),即允许sigmoid(3.0)的调用,而不允许参数取numpy数组,所以为了便于后面操作,我们需要修改为支持Numpy数组的实现。(其实当我们学神经网络时,需要频繁调用Numpy库中的array创建数组,所以我们基本上所有代码都要考虑支持Numpy数组实现) 例如阶跃函数
#阶跃函数
import numpy as np
import matplotlib.pylab as plt
def step_function(x):
return np.array(x>0,dtype=np.int_)
x=np.arange(-5.0,5.0,0.1)
y=step_function(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()
print(step_function(np.array([-1,2,3,-4])))
由于阶跃函数的处理太过于“粗糙”,太局限了,我们尝试使用其他函数作为激活函数,其中比较具有代表性的有sigmoid函数,Relu函数
sigmoid函数
通过python实现该函数
def sigmoid(x):
return 1/(1+np.exp(-x))
这里由于Numpy的广播功能,所以sigmoid函数能支持Numpy数组,所以代码无需写成支持Numpy数组的形式。
完整代码如下
#sigmoid函数
import numpy as np
import matplotlib.pylab as plt
def sigmoid(x):
return 1/(1+np.exp(-x))
x=np.arange(-5.0,5.0,0.1)
y=sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()
通过计较可以看出sigmoid更具有平滑性,而这对神经网络的学习具有重要意义,另一点是阶跃函数只能返回0或1,而sigmoid函数由于平滑性可以返回连续的实数信号值
Relu函数
这是我们最近主要使用的函数
代码如下
#Relu函数
import numpy as np
import matplotlib.pylab as plt
def relu(x):
return np.maximum(0,x)
x=np.arange(-5.0,5.0,0.1)
y=relu(x)
plt.plot(x,y)
plt.ylim(-1,5)
plt.show()
然后我们可以获得Relu函数图像