python实现简单神经网络
- 神经网络的激活函数使用平滑变化的sigmod函数或ReLU函数
- 通过巧妙的使用Numpy多维数组,可以高效地实现神经网络
- 机器学习的问题大体上可以分为回归问题和分类问题
- 关于输出层的激活函数,回归问题中一般用恒等函数,分类问题中一般用softmax函数
- 分类问题中,输出层的神经元的数量设置为要分类的类别数
- 输入数据的集合称为批,通过以批为单位进行推理处理,能够实现高速的运算
一 激活函数
1 阶跃函数
def step_function(x):
return np.array(x>0,dtype=np.int)
x = np.arange(-5.0,5.0,0.1) # x 在(-5,5)内 步长为1
y = step_function(x)
2 sigmod函数
def sigmod(x):
return 1/(1+np.exp(-x))
x = np.arange(-5.0,5.0,0.1)
y = sigmod(x)
3 ReLU函数
f ( x ) = { x x > 0 0 x ≤ 0 f(x)= \begin{cases} x& \text{x > 0}\\ 0& \text{x $ \leq $ 0} \end{cases} f(x)={x0x > 0x ≤ 0
def relu(x):
return np.maximum(0,x)
二 输出函数
恒等函数
def identity_function(x):
return x # 定义输出函数为恒等函数
softmax函数
y k = e ( a k ) ∑ i = 1 n e ( a i ) y_k = \displaystyle \frac{e^{(a_k)}}{\displaystyle \sum^{n}_{i = 1}{e^{(a_i)}}} yk=i=1∑ne(ai)e(ak)
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
三 神经网络前向传播
a
1
(
1
)
=
w
11
(
1
)
x
1
+
w
12
(
1
)
x
2
+
b
1
(
1
)
a^{(1)}_1 = w^{(1)}_{11}x_1 + w^{(1)}_{12}x_2 + b^{(1)}_1
a1(1)=w11(1)x1+w12(1)x2+b1(1)
A
(
1
)
=
X
W
(
1
)
+
B
(
1
)
A^{(1)} = XW^{(1)} + B^{(1)}
A(1)=XW(1)+B(1)
- 激活函数使用sigmod
- 输入层到第1层
X = np.array([1.0,0.5])
W1 = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
B1 = np.array([0.1,0.2,0.3])
A1 = np.dot(X,W1) + B1
Z1 = sigmod(A1)
- 第1层到第2层
W2 = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
B2 = np.array([0.1,0.2])
A2 = np.dot(Z1,W2) + B2
Z2 = sigmod(A2)
- 第2层到输出层
W3 = np.array([[0.1,0.3],[0.2,0.4]])
B3 = np.array([0.1,0.2])
A3 = np.dot(Z2,W3) + B3
Y = identity_function(A3) # 输出
- 封装
- 定义了init_network()和forwar()函数,init_network()进行权重和偏置的初始化,并将它们保存在字典变量network中。
forward()则封装了将输入信号转换为输出信号的处理过程.至此 通过使用Numpy高效的实现了神经网络
ef init_network():
network = { }
network['W1'] = np.array([[0.1,0.3,0.5],[0.2,0.4,0.6]])
network['b1'] = np.array([0.1,0.2,0.3])
network['W2'] = np.array([[0.1,0.4],[0.2,0.5],[0.3,0.6]])
network['b2'] = np.array([0.1,0.2])
network['W3'] = np.array([[0.1,0.3],[0.2,0.4]])
network['b3'] = np.array([0.1,0.2])
return network
def forward(network,x):
W1,W2,W3 = network['W1'],network['W2'],network['W3']
b1,b2,b3 = network['b1'],network['b2'],network['b3']
a1 = np.dot(x,W1) + b1
z1 = sigmod(a1)
a2 = np.dot(z1,W2) + b2
z2 = sigmod(a2)
a3 = np.dot(z2,W3) + b3
y = identity_function(a3)
return y