实验四 基于神经网络的模式识别实验
一、实验目的:
理解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是试验中得到的最终连接权值
输出的第一行是机器给出的答案,第二行是神经网络的输出层输出
对一些噪点比较严重的容易判断错误:
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删