神经网络
输入层(第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
来源:https://www.cnblogs.com/suqinghang/p/12263024.html