离散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

相关文章

SpringBoot集成redisson实现延时队列教程

《SpringBoot集成redisson实现延时队列教程》文章介绍了使用Redisson实现延迟队列的完整步骤,包括依赖导入、Redis配置、工具类封装、业务枚举定义、执行器实现、Bean创建、消费... 目录1、先给项目导入Redisson依赖2、配置redis3、创建 RedissonConfig 配

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja