BP网络学习笔记(三)

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))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值