BP网络的Python实现
本次代码将搭建一个3层的BP神经网络,分别有2,3,2个“神经元”
网络图示
本次网络共设置12个权值,为了方便起见,偏倚b只设置两个,即每层各神经元的偏倚相同。输入值设为(5,10),输出值设为(0.6,0.19)
代码展示
初始化
import numpy as np
#初始化w,导入b,i,为了方便,每个数列的第0位均设为0
w=[0,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65]
b=[0,0.3,0.5]
i=[0,5,10]
#定义sigmoid函数
def sigmoid(x):
return 1.0/(1+np.exp(-x))
前向传播
def bp(w,b,i): #定义bp函数
h1=sigmoid(w[1]*i[1]+w[4]*i[2]+b[1])
h2=sigmoid(w[2]*i[1]+w[5]*i[2]+b[1])
h3=sigmoid(w[3]*i[1]+w[6]*i[2]+b[1])
o1=sigmoid(w[7]*h1+w[9]*h2+w[11]*h3+b[2])
o2=sigmoid(w[8]*h1+w[10]*h2+w[12]*h3+b[2])
e=0.5*(np.square(0.6-o1)+np.square(0.19-o2))#定义误差函数
后向传播
n=0.7 #设置学习率n
t1=-(0.6-o1)*o1*(1-o1)
t2=-(0.19-o2)*o2*(1-o2)
w[7]=w[7]-n*t1*h1
w[9]=w[9]-n*t1*h2
w[11]=w[11]-n*t1*h3
w[8]=w[8]-n*t2*h1
w[10]=w[10]-n*t2*h2
w[12]=w[12]-n*t2*h3
w[1]=w[1]-n*(w[7]*t1+w[8]*t2)*h1*(1-h1)*i[1]
w[4]=w[4]-n*(w[7]*t1+w[8]*t2)*h1*(1-h1)*i[2]
w[2]=w[2]-n*(w[9]*t1+w[10]*t2)*h2*(1-h2)*i[1]
w[5]=w[5]-n*(w[9]*t1+w[10]*t2)*h2*(1-h2)*i[2]
w[3]=w[3]-n*(w[11]*t1+w[12]*t2)*h3*(1-h3)*i[1]
w[6]=w[6]-n*(w[11]*t1+w[12]*t2)*h3*(1-h3)*i[2]
return o1,o2,w,e
迭代学习
for k in range(1000): #循环1000次
o1,o2,w,e=bp(w,b,i)
print("预测值:({},{}),总误差:{},权重:{}".format(o1,o2,e,w))#打印最终结果
结果
可以看到预测值0.6与0.19000000000000047,相比于真值0.6与0.19误差极低。总误差为1.11e10-31
源码
import numpy as np
w=[0,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45,0.5,0.55,0.6,0.65]
b=[0,0.3,0.5]
i=[0,5,10]
def sigmoid(x):
return 1.0/(1+np.exp(-x))
def bp(w,b,i):
h1=sigmoid(w[1]*i[1]+w[4]*i[2]+b[1])
h2=sigmoid(w[2]*i[1]+w[5]*i[2]+b[1])
h3=sigmoid(w[3]*i[1]+w[6]*i[2]+b[1])
o1=sigmoid(w[7]*h1+w[9]*h2+w[11]*h3+b[2])
o2=sigmoid(w[8]*h1+w[10]*h2+w[12]*h3+b[2])
e=0.5*(np.square(0.6-o1)+np.square(0.19-o2))
n=0.7
t1=-(0.6-o1)*o1*(1-o1)
t2=-(0.19-o2)*o2*(1-o2)
w[7]=w[7]-n*t1*h1
w[9]=w[9]-n*t1*h2
w[11]=w[11]-n*t1*h3
w[8]=w[8]-n*t2*h1
w[10]=w[10]-n*t2*h2
w[12]=w[12]-n*t2*h3
w[1]=w[1]-n*(w[7]*t1+w[8]*t2)*h1*(1-h1)*i[1]
w[4]=w[4]-n*(w[7]*t1+w[8]*t2)*h1*(1-h1)*i[2]
w[2]=w[2]-n*(w[9]*t1+w[10]*t2)*h2*(1-h2)*i[1]
w[5]=w[5]-n*(w[9]*t1+w[10]*t2)*h2*(1-h2)*i[2]
w[3]=w[3]-n*(w[11]*t1+w[12]*t2)*h3*(1-h3)*i[1]
w[6]=w[6]-n*(w[11]*t1+w[12]*t2)*h3*(1-h3)*i[2]
return o1,o2,w,e
for k in range(1000):
o1,o2,w,e=bp(w,b,i)
print("预测值:({},{}),总误差:{},权重:{}".format(o1,o2,e,w))