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也可)