1、编程实现BP神经网络算法;
2、探究BP算法中学习因子算法收敛趋势、收敛速度之间的关系;
3、修改训练后BP神经网络部分连接权值,分析连接权值修改前和修改后对相同测试样本测试结果,理解神经网络分布存储等特点。
实现书本上的例题
⑴可修改学习因子
⑵可任意指定隐单元层数
⑶可任意指定输入层、隐含层、输出层的单元数
⑷可输入学习样本(增加样本)
⑸可存储训练后的网络各神经元之间的连接权值矩阵;
⑹修改训练后的BP神经网络部分连接权值,分析连接权值修改前和修改后对相同测试样本测试结果 。
1、 明确BP神经网络算法的基本思想如下:
2 明确BP神经网络算法步骤和流程如下:
步骤:
1.初始化网络权重
2.向前传播输入(前馈型网络)
3.反向误差传播
4.网络权重与神经元偏置调整
5.判断结束
import math
def get_s(w,o,xt,lx,s,num,e):
count=0
flag=0
for i in range(len(lx)):
if num in lx[i]:
count=i+1
break
if count == 2:
for i in range(len(lx[0])):
flag+=w[str(lx[0][i])+str(num)]*o[lx[0][i]-1]
flag+=xt[num-len(lx[0])-1]
elif count ==3:
for i in range(len(lx[1])):
flag+=w[str(lx[1][i])+str(num)]*o[lx[1][i]-1]
flag+=xt[num-len(lx[0])-1]
s.append(flag)
def get_o(w,o,xt,lx,s,num,e):
o.append(1/(1+math.e**(-s[num-len(lx[0])-1])))
def get_e(w,o,xt,lx,s,num,e):
count=0
flag=0
for i in range(len(lx)):
if num in lx[i]:
count=i+1
break
if count == 3:
e.append(o[num-1]*(1-o[num-1])**2)
elif count == 2 :
e.append(o[num-1]*(1-o[num-1])*e[0]*w[str(num)+str(lx[2][0])])
def get_w(w,o,xt,lx,s,e):
for i in range(1,len(lx[0])+1):
for j in range(len(lx[0])+1,len(lx[1])+len(lx[0])+1):
w[str(i)+str(j)]=w[str(i)+str(j)]+0.8*e[lx[2][0]-j]*o[i-1]
for i in range(len(lx)+1,len(lx[1])+len(lx[0])+1):
w[str(i)+str(lx[2][0])]=w[str(i)+str(lx[2][0])]+0.8*e[0]*o[i-1]
def get_xt(w,o,xt,lx,s,e):
for i in range(lx[2][0]-len(lx[0])):
xt[i]=xt[i]+0.8*e[lx[2][0]-lx[1][0]-i]
def main():
numss=list(map(int,input("请分别输入输入 隐含层 输出节点数:(以空格分隔)")\
.split()))
lx=[]
numss1,numss2=1,1
for i in range(len(numss)):
numss2+=numss[i]
lx.append([j for j in range(numss1,numss2)])
numss1+=numss[i]
o=list(map(int,input("请输入训练样本:(以空格分隔)").split()[:numss[0]]))
w={"14":0.2,"15":-0.3,"24":0.4,"25":0.1,"35":0.2,"34":-0.5,"46":-0.3,\
"56":-0.2}
xt=[-0.4,0.2,0.1]
s=[]
e=[]
for i in range(len(lx[1])):
get_s(w,o,xt,lx,s,lx[1][i],e)
get_o(w,o,xt,lx,s,lx[1][i],e)
get_s(w,o,xt,lx,s,lx[2][0],e)
get_o(w,o,xt,lx,s,lx[2][0],e)
for i in range(lx[2][0],lx[1][0]-1,-1):
get_e(w,o,xt,lx,s,i,e)
get_w(w,o,xt,lx,s,e)
get_xt(w,o,xt,lx,s,e)
print("4 5 6 S",end="")
for i in s:
print("%10.3f "%(i),end="")
print()
print("4 5 6 O",end="")
for i in range(len(o)):
if i >=3:
print("%10.3f "%o[i],end="")
print()
print("6 5 4 E",end="")
for i in e:
print("%10.4f "%i,end="")
print()
print("调整后的更新值")
for i in w:
print("W%s =%10.3f "%(i,w[i]))
for i in range(len(xt)):
print("xt%d =%10.3f "%(i+lx[1][0],xt[i]))
if __name__ == "__main__":
main()