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

news2025/1/16 1:34:48

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829997.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

01背包详解(二维到一维)

有 N件物品和一个容量为 V 的背包&#xff0c;每件物品有各自的价值且只能被选择一次&#xff0c;要求在有限的背包容量下&#xff0c;装入的物品总价值最大。「0-1 背包」是较为简单的动态规划问题&#xff0c;也是其余背包问题的基础。 动态规划是不断决策求最优解的过程&am…

基于Stm32的宠物自动喂食装置(包含::论文、代码、外文原文、外文翻译、手册、建模、答辩PPT、原理图等 )

基于Stm32的宠物自动喂食装置 目录 基于Stm32的宠物自动喂食装置 一、Solidworks建模部分 装置外壳 二、TLink物联网平台 1.TLINK平台配置 2.TLINK平台的功能 &#xff08;2&#xff09;定时发送指令 &#xff08;3&#xff09;自动报警 三、Stm32控制部分 1.整体流程图…

STM32 DHT11

DHT11 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。 使用单总线通信 该传感器包括一个电容式感湿元件和一个NTC测温元件&#xff0c;并于一个高性能8位单片机相连&#xff08;模数转换&#xff09;。 DHT11引脚说明 开漏模式下没有输出高电平的能…

代码调试2:coco数据集生成深度图

代码调试:coco数据集生成深度图 作者:安静到无声 个人主页 问题1:图片存在异常,跳过不处理 在获取深度图的时候,直接执代码,会产生以下错误:RuntimeError和ValueError。 因此我重新修改了代码,如果出现以下两种错误,则执行下一次循环,代码如下: 修改之后代码可以…

Day11-Webpack前端工程化开发

Webpack 一 webpack基本概念 遇到问题 开发中希望将文件分开来编写,比如CSS代码,可以分为头部尾部内容,公共的样式。 JS代码也希望拆分为多个文件,分别引入,以后代码比较好维护。 本地图片,希望可以实现小图片不用访问后端,保存在前端代码中就可以了 运行程序时我…

火山引擎DataLeap的Data Catalog系统搜索实践 (上)

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 摘要 火山引擎大数据研发治理套件 DataLeap的Data Catalog系统通过汇总和组织各种元数据&#xff0c;解决了数据生产者梳理数据、数据消费者找数和理解数的业务场景…

生产事故-记一次特殊的OOM排查

0x01 事故背景 2023年3月10日14时19分&#xff0c;C公司开发人员向A公司开发人员反映某开放接口从2023年3月10日14时许开始无法访问和使用。该系统为某基础数据接口服务&#xff0c;基于 HTTP 协议进行通信。按照惯例&#xff0c;首先排查网络是否异常&#xff0c;经运维人员检…

【NX】NX开发入门练习寻找倒圆角设置颜色和添加属性

实现功能如标题&#xff0c;当时学习nx开发用的练习题&#xff0c;用的是nx8.5的32位版本&#xff0c;对于设置属性&#xff0c;一种是可以在界面中查看的属性&#xff0c;一种是隐藏的不能再界面中查看的自定义属性&#xff08;但是可以正常读取&#xff09;。 下面是完整代码…

Netty:ByteBuf的引用计数

说明 Netty的ByteBuf有一个对它本身的引用计数。 可以通过ByteBuf的retain()增加1个引用计数&#xff0c;通过retain(int increment)增加一定数量的引用计数。 通过release()减少1个引用计数&#xff0c;通过release(int decrement)减少一定数量的引用计数。 通过refCnt()查看…

科普 | 以太坊坎昆升级是什么

坎昆升级是什么 坎昆&#xff0c;是墨西哥一个著名的旅游城市&#xff0c;也是 Devcon 3 大会的举办地&#xff0c;按照以太坊升级命名的规律&#xff0c;以地名命名的升级&#xff0c;是针对以太坊执行层的升级。 之前同样命名的还有柏林升级、伦敦升级和这次的上海升级等。…

webapi部署几个错误

第一个错误&#xff1a;无法读取配置节“system.serviceModel”&#xff0c;因为它缺少节声明 发现服务器上没有安装.net Framework 3.5.1 第二个错误&#xff1a;未能从程序集“SYSTEM.SERVICEMODEL, VERSION3.0.0.0 先安装.net framework 4.0再安装 3.5 就会出现这个问题…

8.3线程状态

new: 调用start()方法之前的状态. blocked: 因为锁而阻塞. waiting: 因为调用wait()方法而阻塞. timed_waiting: 因为调用sleep()方法而阻塞. terminated: run()方法执行完毕之后线程的状态.

opencv-33 图像平滑处理-中值滤波cv2.medianBlur()

中值滤波是一种常见的图像处理滤波技术&#xff0c;用于去除图像中的噪声。它的原理是用一个滑动窗口&#xff08;也称为卷积核&#xff09;在图像上移动&#xff0c;对窗口中的像素值进行排序&#xff0c;然后用窗口中像素值的中值来替换中心像素的值。这样&#xff0c;中值滤…

【Valgrind】Valgrind安装(ubuntu系统)

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

SonarQube入门 - 搭建本地环境

一、SonarQube是什么&#xff1f; SonarQube是一种自我管理的自动代码审查工具&#xff0c;可以系统地帮助您交付干净的代码。作为我们Sonar 解决方案的核心元素 &#xff0c;SonarQube 集成到您现有的工作流程中并检测代码中的问题&#xff0c;以帮助您对项目执行持续的代码检…

GD32F103VE点灯

GD32F103VE点灯主要用来学习端口引脚的输出配置。它由LED.c&#xff0c;LED.h&#xff0c;SoftDelay.c和main.c组成。 #include "gd32f10x.h" //使能uint8_t,uint16_t,uint32_t,uint64_t,int8_t,int16_t,int32_t,int64_t #include "SoftDelay.h"#include …

企业微信小程序在调用wx.qy.login时返回错误信息qy.login:fail

原因是大概是绑定了多个企业但是在开发者工具中没有选择正确的企业 解决方法&#xff1a; 重新选择企业后即可成功获取code

BS框架说明

B/S架构 1.B/S框架&#xff0c;意思是前端&#xff08;Browser 浏览器&#xff0c;小程序、app、自己写的&#xff09;和服务器端&#xff08;Server&#xff09;组成的系统的框架结构 2.B/S框架&#xff0c;也可理解为web架构&#xff0c;包含前端、后端、数据库三大组成部分…

考研/面试 数据结构大题必会代码(理解+记忆,实现使用C++,STL库)

文章目录 一. 线性表1. 逆置顺序表所有元素2. 删除线性链表中数据域为 item 的所有结点3. 逆转线性链表(递归(快速解题)非递归)4. 复制线性链表&#xff08;递归&#xff09;5. 将两个按值有序排列的非空线性链表合并为一个按值有序的线性链表 二. 树1. 建立二叉树&#xff08;…

【快应用】同时传递事件对象和自定义参数 ,无法正确接收事件对象

【关键词】 事件绑定、自定义参数、事件对象 【问题背景】 在快应用中采用如下方式绑定组件的事件方法&#xff0c;同时传递事件对象和自定义参数&#xff0c;发现回调方法中没有正确接收到事件对象。 问题代码如下&#xff1a; <template><!-- Only one root nod…