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

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
测试代码及结果:
weightMat =  calcWeight(sample)
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次后回忆出的结果

离散Hopfield神经网络是一种对称的双稳定性神经网络模型,它能够存储和恢复存储的信息。下面是一个用C语言实现离散Hopfield神经网络的简单示例: ```c #include <stdio.h> #include <stdlib.h> #define N 4 //神经元的数量 int weight[N][N] = { {0, -1, 1, -1}, {-1, 0, -1, 1}, {1, -1, 0, -1}, {-1, 1, -1, 0} }; //权重矩阵 int activation(int* x, int i) { int sum = 0; for (int j = 0; j < N; j++) { sum += weight[i][j] * x[j]; } if (sum > 0) { return 1; } else if (sum < 0) { return -1; } else { return x[i]; } } void update(int* x) { int y[N]; for (int i = 0; i < N; i++) { y[i] = activation(x, i); } for (int i = 0; i < N; i++) { x[i] = y[i]; } } int main() { int x[N] = {1, 1, 1, 1}; //初始状态 int t = 0; //迭代次数 while (t < 10) { update(x); t++; } printf("最终状态: "); for (int i = 0; i < N; i++) { printf("%d ", x[i]); } printf("\n"); return 0; } ``` 上述代码中,我们首先定义了一个4x4的权重矩阵,表示神经元之间的连接强度。然后,我们定义了两个函数:`activation`用于计算每个神经元的激活值,`update`用于更新网络状态。`main`函数中,我们初始化了一个初始状态`x`,并进行了10次迭代更新,最后输出最终的状态。 该实现的思路是,根据权重矩阵计算每个神经元的激活值,然后根据激活值确定神经元的输出。迭代更新过程中,每个神经元的输出会受到周围神经元的影响,最终整个网络会趋向于一个稳定的状态。 需要注意的是,上述示例只是一个简化的实现,实际应用中可能需要更复杂的网络结构和更多的神经元。此外,Hopfield网络还存在许多改进和扩展算法,如升级权重矩阵的方法和异步更新的方法等,可以根据需要进行进一步的优化和修改。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值