离散Hopfield神经网络的联想记忆与matlab实现

2024-02-20 10:50

本文主要是介绍离散Hopfield神经网络的联想记忆与matlab实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1案例背景

1.1离散Hopfield神经网络概述

        Hopfield网络作为一种全连接型的神经网络,曾经为人工神经网络的发展开辟了新的研究途径。它利用与阶层型神经网络不同的结构特征和学习方法,模拟生物神经网络的记忆机理,获得了令人满意的结果。这一网络及学习算法最初是由美国物理学家J.JHopfield于1982年首先提出的,故称为Hopfield神经网络。
        Hopfield最早提出的网络是二值神经网络,神经元的输出只取1和一1,所以,也称离散Hopfield神经网络(Discrete Hopfield Neural Network, DHNN)。在离散Hopfield网络中,所采用的神经元是二值神经元,因此,所输出的离散值1和一1分别表示神经元处于激活和抑制状态。
        1.网络结构
        DHNN是一种单层、输出为二值的反馈网络。由三个神经元组成的离散 Hopfield神经网络的结构如图9-1所示。

        在图9-1中,第0层仅仅作为网络的输入,它不是实际神经元,所以无计算功能;第1层是神经元,故而执行对输人信息与权系数的乘积求累加和,并经非线性函数f处理后产生输出信息。f是一个简单的阙值函数,如果神经元的输出信息大于阈值θ,那么,神经元的输出取值为1;小于阈值0,则神经元的输出取值为—1。对于二值神经元,它的计算公式如下:

2.网络工作方式
        Hopfield网络按动力学方式运行,其工作过程为神经元状态的演化过程,即从初始状态按“能量”(Lyapunov函数)减小的方向进行演化,直到达到稳定状态,稳定状态即为网络的输出。
Hopfield网络的工作方式主要有两种形式:
        ①串行(异步)工作方式。在任一时刻t,只有某一神经元ü(随机的或确定的选择)依式(9-4)与式(9-5)变化,而其他神经元的状态不变。
        ②并行(同步)工作方式。在任一时刻t,部分神经元或全部神经元的状态同时改变。下面以串行(异步)工作方式为例说明Hopfield网络的运行步骤:
        步骤1:对网络进行初始化。
        步骤2:从网络中随机选取一个神经元i。步骤3:计算该神经元主的输入ui(t)。
        步骤4:计算该神经元i的输出v;(t+1),此时网络中其他神经元的输出保持不变。
        步骤5:判断网络是否达到稳定状态,若达到稳定状态或满足给定条件则结束;否则转到步骤2继续运行。
        这里网络的稳定状态定义为;若网络从某一时刻以后,状态不再发生变化,则称网络处于稳定状态。

        3.网络稳定性
        从 DHNN的结构可以看出:它是一种多输人,含有阈值的二值非线性动态系统。在动态系统中,平衡稳定状态可以理解为系统某种形式的能量函数在系统运动过程中,其能量值不断减小,最后处于最小值。
        Coben和 Grossberg在1983年给出了关于 Hopfield网络稳定的充分条件,他们指出:如果 Hopfield网络的权系数矩阵W是一个对称矩阵,并且对角线元素为0,则这个网络是稳定的。即在权系数矩阵W中,如果

        则Hopfield网络是稳定的。详细推导过程见参考文献[1]~~[3]。
        应该指出,这只是 Hopfield网络稳定的充分条件,而不是必要条件。在实际中有很多稳定的Hopfield网络,但是它们并不满足权系数矩阵W是对称矩阵这一条件。

1.2数字识别概述

        在日常生活中,经常会遇到带噪声字符的识别问题,如交通系统中汽车车号和汽车牌照,由于汽车在使用过程中,要经受自然环境的风吹日晒,造成字体模糊不清,难以辨认。如何从这些残缺不全的字符中攫取完整的信息,是字符识别的关键问题。作为字符识别的组成部分之一,数字识别在邮政、交通及商业票据管理方面有着极高的应用价值。
        目前有很多种方法用于字符识别,主要分为神经网络识别,概率统计识别和模糊识别等。传统的数字识别方法在有干扰的情况下不能很好地对数字进行识别,而离散型Hopfield神经网络具有联想记忆的功能,利用这一功能对数字进行识别可以取得令人满意的效果,并且计算的收敛速度很快。

1.3 问题描述

        根据Hopfield神经网络相关知识,设计一个具有联想记忆功能的离散型Hopfield神经网络。要求该网络可以正确地识别0~9这10个数字,当数字被一定的噪声干扰后,仍具有较好的识别效果。

2模型建立

2.1设计思路

        假设网络由0~9共10个稳态构成,每个稳态用10×10的矩阵表示。该矩阵直观地描述模拟阿拉伯数字,即将数字划分成10×10的矩阵,有数字的部分用1表示,空白部分用-1表示,如图9-2所示。网络对这10个稳态即10个数字(点阵)具有联想记忆的功能,当有带噪声的数字点阵输入到该网络时,网络的输出便可以得到最接近的目标向量(即10个稳态),从而达到正确识别的效果。

 

2.2 设计步骤

        在此思路的基础上,设计Hopfield网络需要经过以下几个步骤,如图9-3所示。

        1、输入输出设计——设计数字点阵(0~9)
        如图9-2所示,有数字的部分用1表示,空白部分用-1表示,即可得到数字1和数字2的点阵:

array_one = 
[-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];
array_two = 
[-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];

        其他的数字点阵以此类推。

        2.创建 Hopfield网络
        MATLAB神经网络工具箱为Hopfield网络提供了一些工具函数。10个数字点阵,即Hopfield网络的目标向量确定以后,可以借助这些函数,方便地创建Hopfield网络。具体过程见9.4节。
        3.产生带噪声的数字点阵
        带噪声的数字点阵,即点阵的某些位置的值发生了变化。模拟产生带噪声的数字矩阵方法有很多种,由于篇幅所限,本书仅列举两种比较常见的方法:固定噪声产生法和随机噪声产生法。
        4.数字识别测试
        将带噪声的数字点阵输入到创建好的Hopfield网络,网络的输出是与该数字点阵最为接近的目标向量,即0~9中的某个数字,从而实现联想记忆的功能。
        5.结果分析
        对测试的结果进行分析、比较,通过大量的测试来验证Hopfield 网络用于数字识别的可行性与有效性。

3 Hopfield网络的神经网络工具箱函数

        MATLAB神经网络工具箱中包含了许多用于Hopfield网络分析与设计的函数,本节将详细说明常用的两个函数的功能、调用格式以及参数意义等。

3.1 Hopfield网络创建函数

        newhop()函数用于创建一个离散型 Hopfield神经网络,其调用格式为:

net = newhop(T);

其中,T是具有Q个目标向量的RXQ矩阵(元素必须为-1或1);net为生成的神经网络,具有在T中的向量上稳定的点。
        Hopfield神经网络仅有一层,其激活函数用satlins()函数。9.3.2 Hopfield网络仿真函数
sim()函数用于对神经网络进行仿真,其调用格式为:

[Y,Af,E, perf] = sim(net,P.Ai,T)
[Y,Af,E,perf] =sim(net,{Q TS} ,Ai,T)

        其中,P,Q为测试向量的个数;Ai表示初始的层延时,默认为0;T表示测试向量(矩阵或元胞数组形式);TS为测试的步数;Y为网络的输出矢量;Af为训练终止时的层延迟状态;E为误差矢量; perf为网络的性能。

        函数中用到的参数采取了两种不同的形式进行表示:矩阵和元胞数组。矩阵的形式只用于仿真的时间步长TS=1的场合,元胞数组形式常用于一些没有输入信号的神经网络。

4 MATLAB 实现

        利用MATLAB神经网络工具箱提供的函数,将设计步骤一一在MATLAB环境下实现,matlab代码如下:

%% Hopfield神经网络的联想记忆——数字识别%% 清空环境变量
clear all
clc%% 数据导入
load data1 array_one
load data2 array_two%% 训练样本(目标向量)T = [array_one;array_two]';%% 创建网络net = newhop(T);%% 数字1和2的带噪声数字点阵(固定法)
load data1_noisy noisy_array_one
load data2_noisy noisy_array_two%% 数字1和2的带噪声数字点阵(随机法)% noisy_array_one=array_one;
% noisy_array_two=array_two;
% for i = 1:100
%     a = rand;
%     if a < 0.3
%        noisy_array_one(i) = -array_one(i);
%        noisy_array_two(i) = -array_two(i);
%     end
% end%% 数字识别% 单步仿真——TS = 1(矩阵形式)
% identify_one = sim(net,10,[],noisy_array_one');  
% 多步仿真——元胞数组形式
noisy_one = {(noisy_array_one)'};                    
identify_one = sim(net,{10,10},{},noisy_one);
identify_one{10}';
noisy_two = {(noisy_array_two)'};
identify_two = sim(net,{10,10},{},noisy_two);
identify_two{10}';%% 结果显示
Array_one = imresize(array_one,20);
subplot(3,2,1)
imshow(Array_one)
title('标准(数字1)') 
Array_two = imresize(array_two,20);
subplot(3,2,2)
imshow(Array_two)
title('标准(数字2)') 
subplot(3,2,3)
Noisy_array_one = imresize(noisy_array_one,20);
imshow(Noisy_array_one)
title('噪声(数字1)') 
subplot(3,2,4)
Noisy_array_two = imresize(noisy_array_two,20);
imshow(Noisy_array_two)
title('噪声(数字2)')
subplot(3,2,5)
imshow(imresize(identify_one{10}',20))
title('识别(数字1)')
subplot(3,2,6)
imshow(imresize(identify_two{10}',20))
title('识别(数字2)')

 

5案例扩展

5.1识别效果讨论

        图9-5所示是噪声强度为0.1(即10%的数字点阵位置值发生了改变)时的识别效果,从图中可以看出识别效果很好。进一步的研究发现,随着噪声强度的增加,识别效果逐渐下降。噪声强度为0.2和0.3时的识别结果分别如图9-6和图9-7所示,从图中不难看出,当噪声强度为0.3时,Hopfield已经很难对数字进行识别。

 

5.2应用扩展

        离散型 Hopfield神经网络具有联想记忆的功能。近年来,越来越多的研究人员尝试着将Hopfield神经网络应用到各个领域,因此解决了很多传统方法难以解决的问题,如水质评价、发电机故障诊断、项目风险分析等。
        将一些优化算法与离散Hopfield神经网络相结合,可以使其联想记忆能力更强,应用效果更为突出。例如,由于一般离散Hopfield神经网络存在很多伪稳定点,网络很难达到真正的稳态。将遗传算法应用到离散Hopfield神经网络中,利用遗传算法的全局搜索能力,对Hopfield联想记忆稳态进行优化,使待联想的模式跳出伪稳定点,从而使Hopfield网络在较高噪信比的情况下保持较高的联想成功率。

完整数据文件和代码可以戳这个链接下载:

https://download.csdn.net/download/weixin_44209907/88152893

这篇关于离散Hopfield神经网络的联想记忆与matlab实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/727978

相关文章

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

SpringBatch数据写入实现

《SpringBatch数据写入实现》SpringBatch通过ItemWriter接口及其丰富的实现,提供了强大的数据写入能力,本文主要介绍了SpringBatch数据写入实现,具有一定的参考价值,... 目录python引言一、ItemWriter核心概念二、数据库写入实现三、文件写入实现四、多目标写入

Android Studio 配置国内镜像源的实现步骤

《AndroidStudio配置国内镜像源的实现步骤》本文主要介绍了AndroidStudio配置国内镜像源的实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录一、修改 hosts,解决 SDK 下载失败的问题二、修改 gradle 地址,解决 gradle

SpringSecurity JWT基于令牌的无状态认证实现

《SpringSecurityJWT基于令牌的无状态认证实现》SpringSecurity中实现基于JWT的无状态认证是一种常见的做法,本文就来介绍一下SpringSecurityJWT基于令牌的无... 目录引言一、JWT基本原理与结构二、Spring Security JWT依赖配置三、JWT令牌生成与

SpringBoot实现微信小程序支付功能

《SpringBoot实现微信小程序支付功能》小程序支付功能已成为众多应用的核心需求之一,本文主要介绍了SpringBoot实现微信小程序支付功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作... 目录一、引言二、准备工作(一)微信支付商户平台配置(二)Spring Boot项目搭建(三)配置文件