BP神经网络python程序

from numpy import *
def num():
	number = input("请输入初始值: ")
	w=zeros(8)
	b=zeros(2)
	for i in range(0,10):
		if i==0 or i==1 or i==2 or i==3:
			if int(number[i])%2 == 0:
				w[i]=int(number[i])*0.1
			else:
				w[i] =int(number[i]) * 0.1+0.05
		elif i==4:
			if int(number[i]) % 2 == 0:
				b[0] = int(number[i]) * 0.1
			else:
				b[0] = int(number[i]) * 0.1 + 0.05
		elif i==5 or i==6 or i==7 or i==8:
			if int(number[i])%2 == 0:
				w[i-1]=int(number[i])*0.1
			else:
				w[i-1] = int(number[i]) * 0.1+0.05
		elif i==10:
			if int(number[i]) % 2 == 0:
				b[1] =int(number[i]) * 0.1
			else:
				b[1] =int(number[i]) * 0.1 + 0.05
	return w,b
#激活函数 f(x)=1/(1+exp(-x))
def sigmoid(x):
	return 1.0/(1+exp(-x))
#求导 aLt/af(o1)
def lf(t,f):
	return f-t
#求导 af(o1)/ao1
def ft(f):
	return f*(1-f)
#前向
def forward(x,w,b):
	y=0
	for i in range(0,2):
		y=y+w[i]*x[i]
	y=y+b
	return y
#权值更新
def back1(w,fo1,to1,h):
	alpha=0.5
	lw=lf(to1,fo1)*ft(fo1)*h
	w1=w-alpha*lw
	return w1
def back2(to1,fo1,h1,to2,fo2,h2,fh1,i1,w):
	alpha=0.5
	lw=(lf(to1,fo1)*ft(fo1)*h1+lf(to2,fo2)*ft(fo2)*h2)*ft(fh1)*i1
	w1 = w - alpha * lw
	return w1

w,b=num()
I=array([0.05,0.1])  #输入
O=array([0.01,0.99])  #输出
h=[]
h1=forward(I,w[:2],b[0])
fh1=sigmoid(h1)
h.append(fh1)
h2=forward(I,w[2:4],b[0])
fh2=sigmoid(h2)
h.append(fh2)
o1=forward(h,w[4:6],b[1])
fo1=sigmoid(o1)
o2=forward(h,w[6:],b[1])
fo2=sigmoid(o2)

wnew=[]
w5new=back1(w[4],fo1,O[0],fh1)
w6new=back1(w[5],fo1,O[0],fh2)
w7new=back1(w[6],fo2,O[1],fh1)
w8new=back1(w[7],fo2,O[1],fh2)
w1new=back2(O[0],fo1,w[4],O[1],fo2,w[6],fh1,I[0],w[0])
w2new=back2(O[0],fo1,w[4],O[1],fo2,w[6],fh1,I[1],w[1])
w3new=back2(O[0],fo1,w[5],O[1],fo2,w[7],fh1,I[0],w[2])
w4new=back2(O[0],fo1,w[5],O[1],fo2,w[7],fh1,I[1],w[3])

wnew.append(w1new)
wnew.append(w2new)
wnew.append(w3new)
wnew.append(w4new)
wnew.append(w5new)
wnew.append(w6new)
wnew.append(w7new)
wnew.append(w8new)

hh=[]
h1new=forward(I,wnew[:2],b[0])
fh1new=sigmoid(h1new)
hh.append(fh1new)
h2new=forward(I,wnew[2:4],b[0])
fh2new=sigmoid(h2new)
hh.append(fh2new)
o1new=forward(h,wnew[4:6],b[1])
fo1new=sigmoid(o1new)
o2new=forward(h,wnew[6:],b[1])
fo2new=sigmoid(o2new)
print('fh1=',fh1,'\nfh2=',fh2)
print('\nfo1=',fo1,'\nfo2=',fo2)
print('\nw1new=',w1new,'\nw2new=',w2new,'\nw3new=',w3new,'\nw4new=',w4new,'\nw5new=',w5new,'\nw6new=',w6new,'\nw7new=',w7new,'\nw8new=',w8new)
print('\nfh1new=',fh1new,'\nfh2new=',fh2new)
print('\nfo1new=',fo1new,'\nfo2new=',fo2new)

python代码,仅能完成一次正向,一次反向,新的权值一次正向计算

输入初始值,如果是奇数,则将输入数字*0.1+0.05,如果是偶数,仅乘0.1,

例如上题中,输入5044556086,则得到

w1=0.55, w2=0, w3=0.4, w4=0.4, b1=0.55,

w5=0.55, w6=0.6, w7=0, w8=0.8, b2=0.6,

(可以任意改变,1122334455也可)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值