神经网络
输入层(第0层)->中间层(隐藏层)->输出层(最后一层)
隐藏层的激活函数
- 将输入信号的总和转换为输出信号.决定如何来激活输入信号的总和
- 先计算输入信号的加权总和(带偏置),然后用激活函数转换这一总和
\[ a = b+\omega_1x_1+\omega_2x_2\\ y = h(a) \]
阶跃函数
以阈值为界,一旦输入超过阈值,就切换输出
#阶跃函数的实现
import numpy as np
def step_function(x):
y = x > 0
return y.astype(np.int)
step_function(np.array([-1.0,1.0,2.0]))
array([0, 1, 1])
#绘制阶跃函数的图形
import matplotlib.pylab as plt
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()
sigmoid函数
\[ h(x) = \frac{1}{1+exp(-x)} \]
#sigmoid函数的实现
def sigmoid(x):
return 1/(1+np.exp(-x))
x = np.array([-1.0,1.0,2.0])
sigmoid(x)
array([0.26894142, 0.73105858, 0.88079708])
#绘制sigmoid函数的图像
x = np.arange(-5.0,5.0,0.1)
y1 = sigmoid(x)
plt.plot(x,y1)
plt.ylim(-0.1,1.1)
plt.show()
ReLU函数
Rectified Linear Unit函数在输入大于0时,直接输出该值;在输入小于等于0时,输出0
\[
h(x)=\begin{cases}
x,& \text{$x>0$}\\
0,& \text{$x\leq 0$}
\end{cases}
\]
#ReLU函数的实现
def relu(x):
return np.maximum(0,x)
#绘制ReLU函数的图像
x = np.arange(-5.0,5.0,0.1)
y = relu(x)
plt.plot(x,y)
plt.ylim(-1.0,5.0)
plt.show()
输出层的激活函数
一般而言,回归问题用恒等函数,分类问题用softmax函数
- 恒等函数:将输入按原样输出,对于输入的信息,不加以任何改动的直接输出
- softmax函数
\[ y_k=\frac{exp(a_k)}{\sum_{i=1}^nexp(a_i)} \]
输出层共有n个神经元,计算第k个神经元的输出\(y_k\)
#softmax函数的实现
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
softmax函数的注意事项
softmax函数在实现中要进行指数函数的运算,此时指数函数的值很容易变得非常大.超大值之间进行除法运算,会出现"不确定"的情况
改进
\[
y_k = \frac{exp(a)k)}{\sum_{i=1}^nexp(a_i)}=\frac{exp(a_k+C)}{\sum_{i=1}^nexp(a_i+C)}
\]
def softmax(a):
c = np.max(a)
exp_a = np.exp(a-c)
sum_exp_a = np.sum(exp_a)
y =exp_a / sum_exp_a
return y