原理部分:此部分主要数学知识为方程的求导,如不懂则直接重点看公式3.22a与3.22b





注:Wjk ,如W21代表从y2神经元到W1输出的权值 。Vij同理 xi到yj的权值


注:输出误差E是人为规定的一种评判去往与实际输出之间差距的公式
(d:期望输出向量,O输出层输出向量)






注:如果上述推导不懂,则直接看公式3.22a与3.22b(三层神经网络)
3.22a中 n已知(学习率) dk已知 ok已知,yi已知,可以求出
3.22b同理
所以当初始化后可以把W与V,算出,然后使用梯度下降算法不断更改两个权值,训练算法等到最后将结果(具体细节内容未写出,后续再CS231n课程中解释)


代码部分:
用BP神经网络解决异或问题,即四点分类问题

import numpy as np
import matplotlib.pyplot as plt
X=np.array([[1,0,0],
[1,0,1],
[1,1,0],
[1,1,1]])#此时的X数据为四个点,用单层感知器无法进行分类
#标签
Y=np.array([[0,1,1,0]])
#权值初始化,取值范围-1到1
V=np.random.random((3,4))*2-1
W=np.random.random((4,1))*2-1
print(V)
print(W)
#定义学习率
lr=0.11
def sigmoid(x):#激活函数
return 1/(1+np.exp(-x))
def dsigmoid(x):#激活函数的倒数
return x*(1-x)
def updata():#更新权值函数
global X,Y,W,V,lr
L1=sigmoid(np.dot(X,V))#隐藏层的输出(4,4)#sigmoid作用与输出乘以权值矩阵
L2=sigmoid(np.dot(L1,W))#输出层的输出(4,1)#sigmoid作用与上一层输出乘以权重
#公式3.21a与3.21b
#误差信号
#逆向传播先算L2的倒数,然后再算L1的倒数
L2_delta=(Y.T-L2)*dsigmoid(L2)#L2的倒数=理想输出-实际输出*L2经过激活函数的倒数
L1_delta=L2_delta.dot(W.T)*dsigmoid(L1)#L2的倒数=L2的倒数*权值(上一层的反馈)*L1进过激活函数的倒数
#公式3.22a与3.22b
#权值更新W的改变与V的改变
W_C=lr*L1.T.dot(L2_delta)#学习率*L1.T*L2的倒数
V_C=lr*X.T.dot(L1_delta)#同理
W=W+W_C#W+W的改变
V=V+V_C
for i in range(20000):#迭代20000次
updata()#更新权值
if i%500==0:#每隔500次输出一次误差
L1=sigmoid(np.dot(X,V))#隐藏层的输出(4,4)
L2=sigmoid(np.dot(L1,W))#输出层的输出(4,1)
print ('Errir:',np.mean(np.abs(Y.T-L2)))#打印误差
#查看最后结果
L2_delta=(Y.T-L2)*dsigmoid(L2)
L1_delta=L2_delta.dot(W.T)*dsigmoid(L1)
print (L2)
#显示结果
def judge(x):
if(x>=0.5):
return 1
else:
return 0
for i in map(judge,L2):
print(i)
结果:
误差迭代结果
Errir: 0.0180866139347
Errir: 0.0179476295453
Errir: 0.0178115917954
Errir: 0.0176783982971
Errir: 0.0175479515451
Errir: 0.017420158622
Errir: 0.0172949309258
Errir: 0.0171721839174
Errir: 0.0170518368842
Errir: 0.0169338127223
Errir: 0.0168180377318
Errir: 0.0167044414276
Errir: 0.0165929563614
Errir: 0.0164835179567
Errir: 0.0163760643544
Errir: 0.0162705362675
Errir: 0.0161668768464
Errir: 0.0160650315519
Errir: 0.0159649480366
Errir: 0.0158665760329
Errir: 0.0157698672493
Errir: 0.015674775271
Errir: 0.0155812554684
Errir: 0.01548926491
Errir: 0.0153987622803
Errir: 0.0153097078028
Errir: 0.0152220631678
Errir: 0.0151357914634
Errir: 0.0150508571112
Errir: 0.014967225805
Errir: 0.0148848644534
Errir: 0.0148037411251
Errir: 0.0147238249974
Errir: 0.0146450863075
Errir: 0.0145674963063
Errir: 0.0144910272144
Errir: 0.0144156521808
Errir: 0.0143413452436
Errir: 0.0142680812924
Errir: 0.0141958360334
最后模型结果:
[[ 0.00820949]
[ 0.98378477]
[ 0.9855559 ]
[ 0.01791453]]
0
1
1
0
网友评论