您的位置:首页 > 理论基础 > 计算机网络

实战——离散Hopfield神经网络的实现

2017-05-11 18:27 555 查看

Hopfield神经网络简介

一种循环神经网络,主要用于联想记忆。离散Hopfield网络是一个单层网络,有n个神经元节点,每个神经元的输出均接到其它神经元的输入。各节点没有自反馈。每个节点都可处于一种可能的状态(1或-1),即当该神经元所受的刺激超过其阀值时,神经元就处于一种状态(比如1),否则神经元就始终处于另一状态(比如 -1)。


关于Hopfield网络的详细介绍,请看维基百科:Hopfield神经网络

Hopfield神经网络的实现

1.根据Hebb学习规则计算神经元之间的连接权值


def calcWeight(savedsample):
N = len(savedsample[0])
P = len(savedsample)
mat = [0]*N
returnMat = []
for i in range(N):
m = mat[:]
returnMat.append(m)
for i in range(N):
for j in range(N):
if i==j:
continue
sum = 0
for u in range(P):
sum += savedsample[u][i] * savedsample[u][j]
returnMat[i][j] = sum/float(N)
return returnMat


2.根据神经元的输入计算神经元的输出(静态突触)


def calcXi(inMat , weighMat):
returnMat = inMat
choose = []
for i in range(len(inMat)/5):
#随机改变N/5个神经元的值,该参数可调,也可同时改变所有神经元的值
choose.append(random.randint(0,len(inMat)-1))
for i in choose:
sum = 0
for j in range(len(inMat)):
sum += weighMat[i][j] * inMat[j]
if sum>=0:
returnMat[i] = 1
else: returnMat[i] = -1
return returnMat


假设计算第t次循环后神经元的输出时,输入的参数inMat表示第t-1次循环后神经元的输出。即用上一次循环的输出做本次循环的输入。


测试结果

记忆样本,4个5x5的矩阵(来源于网络,分别表示字母N,E,R,0):


sample =  [[1,-1,-1,-1,1,
1,1,-1,-1,1,
1,-1,1,-1,1,
1,-1,-1,1,1,
1,-1,-1,-1,1],
[1,1,1,1,1,
1,-1,-1,-1,-1,
1,1,1,1,1,
1,-1,-1,-1,-1,
1,1,1,1,1],
[1,1,1,1,-1,
1,-1,-1,-1,1,
1,1,1,1,-1,
1,-1,-1,1,-1,
1,-1,-1,-1,1],
[-1,1,1,1,-1,
1,-1,-1,-1,1,
1,-1,-1,-1,1,
1,-1,-1,-1,1,
-1,1,1,1,-1]]


加噪函数,在记忆样本的基础上增加30%的噪声:


def addnoise(mytest_data,n):
for x in range(n):
for y in range(n):
if random.randint(0, 10) > 7:
mytest_data[x * n + y] = -mytest_data[x * n + y]
return mytest_data


标准输出函数:


def regularout(data,N):
for j in range(N):
ch = ""
for i in range(N):
ch += " " if data[j*N+i] == -1 else "X"
print ch


测试代码及结果:


regularout(sample[1],5)
test = addnoise(sample[1],5)
regularout(test,5)
for i in range(2000):
test = calcXi(test,weightMat
regularout(test,5)


从上到下,第一张为记忆样本、第二张为加噪的记忆样本、第三张为循环2000次后回忆出的结果


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息