激活函数


激活函数必须为非线性函数,线性函数的问题在于,不管如何加深层数,等效于无隐藏层的神经网络
例如: 线性函数h(x) = cx作为激活函数,
y(x) = h(h(h(x))) 三层神经网络,简化为y(x)=c_c_c*x,无法发挥多层网络带来的优势。


1)阶跃函数:


# coding: utf-8
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)  # 指定图中绘制的y轴的范围
plt.show()

图形如下
在这里插入图片描述


step_function 实现分解
>>> import numpy as np
>>> x = np.array([-1.0,1.0,2.0])
>>> x
array([-1.,  1.,  2.])
>>> y=x>0
>>> y
array([False,  True,  True])
>>> y=y.astype(np.int)
>>> y
array([0, 1, 1])

2)sigmoid函数:
sigmoid是一条平滑的曲线,输出随着输入的发生连续性的变化。而阶跃函数以0为界,输出发生剧烈变化。函数的平滑性对神经网络的学习具有重要意义。
另外一种不同,相对于阶跃函数只能返回0或1,sigmoid函数可以返回0.731…,0.880等实数。
sigmoid可以比作为水车,根据流过来的水量相应地调整传送出去的水量。


# coding: utf-8
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()

图形如下
在这里插入图片描述
3)Relu函数
在这里插入图片描述


# coding: utf-8
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.0, 5.5)
plt.show()

图形如下
在这里插入图片描述