BP神经网络实验:深入仿真研究

实验四 基于神经网络的模式识别实验



一、实验目的:

理解BP神经网络和离散Hopfield神经网络的结构和原理,掌握反向传播学习算法对神经元的训练过程,了解反向传播公式。通过构建BP网络和离散Hopfield网络模式识别实例,熟悉前馈网络和反馈网络的原理及结构。



二、实验原理

BP学习算法是通过反向学习过程使误差最小,其算法过程从输出节点开始,反向地向第一隐含层(即最接近输入层的隐含层)传播由总误差引起的权值修正。BP网络不仅含有输入节点和输出节点,而且含有一层或多层隐(层)节点。输入信号先向前传递到隐节点,经过作用后,再把隐节点的输出信息传递到输出节点,最后给出输出结果。

离散Hopfield神经网络的联想记忆过程分为学习和联想两个阶段。在给定样本的条件下,按照Hebb学习规则调整连接权值,使得存储的样本成为网络的稳定状态,这就是学习阶段。联想是指在连接权值不变的情况下,输入部分不全或者受了干扰的信息,最终网络输出某个稳定状态。


三、实验条件:

Matlab 7.X 的神经网络工具箱或者python或者C/C++语言。



四、实验内容:

1.针对教材例8.1,设计一个三层的BP网络结构模型,并以教材图8.5 为训练样本数据,图8.6为测试数据。

将测试数据化为数组方便测试时调用:

登录后复制

test=[np.array([[0,0,0,0,0,0,0,
             0,1,1,0,1,1,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,0,0,1,0,0,0,
             0,0,0,1,0,0,0,
             0,0,0,0,0,0,0,
             0,0,0,1,0,0,0,
             0,0,0,1,0,0,0,
             0,0,0,1,0,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0,
             0,0,0,0,0,1,0,
             0,1,0,1,1,1,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,0,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,0,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,1,0,
             0,0,0,1,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,0,0,1,0,0,
             0,0,1,1,1,1,0,
             0,0,0,0,0,0,0,
             0,0,0,0,1,0,0,
             0,0,0,0,1,0,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,1,1,0,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,0,1,1,1,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,1,1,1,0,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,0,1,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,1,0,0,
             0,0,0,1,0,0,0,
             0,0,1,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,0,1,1,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,1,0,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,0,1,1,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,0,0]])]
             

其他代码:

登录后复制

import numpy as np

PSIZE=7*9
LEARN=0.1 #学习率
IN=[np.array([[0,0,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,0,0,1,0,0,0,
             0,0,1,1,0,0,0,
             0,0,0,1,0,0,0,
             0,0,0,1,0,0,0,
             0,0,0,1,0,0,0,
             0,0,0,1,0,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,1,0,
             0,0,0,1,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,0,0,1,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,1,0,0,
             0,0,0,0,1,0,0,
             0,0,0,0,1,0,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,1,0,0,
             0,0,0,1,0,0,0,
             0,0,1,0,0,0,0,
             0,1,0,0,0,0,0,
             0,1,0,0,0,0,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,0,0]]),
   np.array([[0,0,0,0,0,0,0,
             0,1,1,1,1,1,0,
             0,1,0,0,0,1,0,
             0,1,0,0,0,1,0,
             0,1,1,1,1,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,1,0,
             0,0,0,0,0,0,0]])]

Out=[np.array([[1,0,0,0,0,0,0,0,0,0]]),
     np.array([[0,1,0,0,0,0,0,0,0,0]]),
     np.array([[0,0,1,0,0,0,0,0,0,0]]),
     np.array([[0,0,0,1,0,0,0,0,0,0]]),
     np.array([[0,0,0,0,1,0,0,0,0,0]]),
     np.array([[0,0,0,0,0,1,0,0,0,0]]),
     np.array([[0,0,0,0,0,0,1,0,0,0]]),
     np.array([[0,0,0,0,0,0,0,1,0,0]]),
     np.array([[0,0,0,0,0,0,0,0,1,0]]),
     np.array([[0,0,0,0,0,0,0,0,0,1]])]

def sigmoid(x):
    return 1/(1+np.exp(-x))

def printy(X,W1,W2):
    inh=np.dot(X,W1)
    outh=sigmoid(inh)
    iny=np.dot(outh,W2.T)
    outy=sigmoid(iny)    
    for i in range(len(outy[0])):
        if outy[0][i]==max(outy[0]):
            print(i)
            break
    print(outy)

W1=(np.random.randint(0,1024,size=(PSIZE,5))-512)/2**10
W2=(np.random.randint(0,1024,size=(10,5))-512)/2**10
for h in range(20000):
    k=h%10
    X=IN[k]
    Y=Out[k]
    inh=np.dot(X,W1)
    outh=sigmoid(inh)
    iny=np.dot(outh,W2.T)
    outy=sigmoid(iny)
    w2=[]
    w0=[]
    w=Y-outy
    for i in range(10):
        for j in range(5):
            w0.append(-w[0][i]*outy[0][i]*(1-outy)[0][i]*outh[0][j])
        w2.append(w0)
        w0=[]
    w2g=LEARN*np.array(w2)
    w2=[]
    w0=[]
    w=Y-outy
    for i in range(5):
        for j in range(10):
            w0.append(-w[0][j]*outy[0][j]*(1-outy)[0][j]*W2[j][i])
        w2.append(sum(w0))
        w0=[]
    w=np.array(w2)
    w1=[]
    for i in range(PSIZE):
        for j in range(5):
            w0.append(w[j]*outh[0][j]*(1-outh)[0][j]*X[0][i])
        w1.append(w0)
        w0=[]
    w1g=LEARN*np.array(w1)
    W1-=w1g
    W2-=w2g
    

调用程序里编的printy自定义函数进行输入测试:

W1和W2是试验中得到的最终连接权值

输出的第一行是机器给出的答案,第二行是神经网络的输出层输出

bp神经网络 仿真 bp神经网络实验_测试数据

对一些噪点比较严重的容易判断错误:

bp神经网络 仿真 bp神经网络实验_测试数据_02


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删

QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空