计算智能-BP神经网络算法

一、实验目的

1、编程实现BP神经网络算法;
2、探究BP算法中学习因子算法收敛趋势、收敛速度之间的关系;
3、修改训练后BP神经网络部分连接权值,分析连接权值修改前和修改后对相同测试样本测试结果,理解神经网络分布存储等特点。

二、实验要求

实现书本上的例题
⑴可修改学习因子
⑵可任意指定隐单元层数
⑶可任意指定输入层、隐含层、输出层的单元数
⑷可输入学习样本(增加样本)
⑸可存储训练后的网络各神经元之间的连接权值矩阵;
⑹修改训练后的BP神经网络部分连接权值,分析连接权值修改前和修改后对相同测试样本测试结果 。

三、实验原理

1、 明确BP神经网络算法的基本思想如下:

计算智能-BP神经网络算法_第1张图片

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()
    

你可能感兴趣的:(计算智能,人工智能,算法,神经网络,python)