⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要10分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿

❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我

1. Hopfield网络原理分析

Hopfield网络是神经网络发展历史上的一个重要的里程碑。由美国加州理工学院物理学家J.J.Hopfield教授于1982年提出,是一种单层反馈神经网络。
1984年,Hopfield设计并研制了网络模型的电路,并成功地解决了旅行商(TSP)计算难题(优化问题)。
Hopfield网络是一种互连型网络,它引入类似于切Lyapunov函数的能量函数概念,在满足条件的情况下,某种“能量函数”的能量在网络运行过程中不断地减少,最后趋于稳定的平衡状态。对于一个非线性动力学系统,系统的状态从某一初值出发经过演变后可能有如下几种结果:渐进稳定点(吸引子)、极限环、混沌、状态发散。
因为人工神经网络的变换函数是一个有界函数,故系统的状态不会发生发散现象。目前,人工神经网络经常利用渐进稳定点来解决某些问题。如果把系统的稳定点视为一个记忆的话,那么从初态朝这个稳定点的演变过程就是一个寻找记忆的过程。如果把系统的稳定点视为一个能量函数的极小点,而把能量函数视为一个优化问题的目标函数,那么从初态朝这个稳定点的演变过程就是一个求解该优化问题的过程。因此,HoPfield神经网络的演变过程是一个计算联想记忆或求解优化问题的过程。实际上,它的解决并不需要真的去计算,而是通过构成反馈神经网络,适当地设计其连接权和输入就可以达到这个目的。
Hopfield神经网络模型是一种循环神经网络,从输出到输入有反馈连接。在输入的激励下,会产生不断的状态变化。对于一个Hopfield网络来说,关键是在于确定它在稳定条件下的权系数。反馈网络有稳定的,也有不稳定的。对于Hopfield网络来说,如何判别其稳定性也是需要确定的。

2. Hopfield数字识别

Hopfield神经网络模型如图所示,它是一种循环神经网络,从输出到输入有反馈连接,通过不断的调整权值,使得系统能量函数不断的趋向于最小,达到系统收敛的目的。
在这里插入图片描述

2.1 离散Hopfield网络(DHNN)

对于离散Hopfield网络(DHNN)而言,神经元的输出只取1和0,分别表示神经元处于激活和抑制状态。对于二值神经元,它的计算公式如下:

在这里插入图片描述

一个DHNN的网络状态是输出神经元信息的集合。对于一个输出层是 n 个神经元的网络,其t 时刻的状态为一个 n 维向量:

在这里插入图片描述

如果Hopfield网络是一个稳定网络,若在网络的输入端加入一个输入向量,则网络的状态会产生变化,如图26-2所示,即从超立方体的一个顶点转向另一个顶点,并且最终稳定于一个特定的顶角。

在这里插入图片描述

2.2 连续Hopfield网络

对于连续Hopfield网络(CHNN)而言,拓扑结构和DHNN的结构相同。不同之处在于其函数g不是阶跃函数,而是S形的连续函数。一般取:
g ( u ) = 1 1 + e u g(u)=\frac{1}{1+e^u} g(u)=1+eu1

MATLAB工具箱Hopfield网络函数形式如下:

在这里插入图片描述

在这里插入图片描述

2.3 基于DHNN的数字识别

用离散Hopfield网络,使其具有联想记忆功能,能正确识别阿拉伯数字,当数字被噪声污染后仍可以正确地识别。
假设网络由0-9共10个稳态构成,每个稳态由 10 x 10 的矩阵构成,该矩阵用于模拟阿拉伯数字点阵。即将数字划分成 10 x 10 方阵,有数字的部分用1表示,空白处用-1表示。

用离散Hopfield网络,使其具有联想记忆功能,能正确识别阿拉伯数字,当数字被噪声污染后仍可以正确地识别。
假设网络由0-9共10个稳态构成,每个稳态由 10 x 10 的矩阵构成,该矩阵用于模拟阿拉伯数字点阵。即将数字划分成 10 x 10 方阵,有数字的部分用1表示,空白处用-1表示。

离散Hopfield网络算法设计流程图

在这里插入图片描述

clc % 清屏
clear all; % 删除workplace变量
close all; % 关掉显示图形窗口
% 数字0
zero=[-1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
     -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
     -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
     -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
     -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1];
ZERO=imresize(zero,20);
subplot(2,5,1)
imshow(ZERO)
% 数字1
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];
 ONE=imresize(one,20);
 subplot(2,5,2)
 imshow(ONE)
 % 数字2
 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];
 TWO=imresize(two,20);
 subplot(2,5,3)
 imshow(TWO)
 % 数字3
 three=[-1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
       -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
        -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
       -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
       -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1];
 THREE=imresize(three,20);
 subplot(2,5,4)
 imshow(THREE)
% 数字4
 four=[-1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
      -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
      -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
      -1 1 1 1 1 1 1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
      -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1];
 FOUR=imresize(four,20);
 subplot(2,5,5)
 imshow(FOUR)
  % 数字5
 five=[-1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
       -1 1 1 -1 -1 -1 -1 -1 -1 -1;-1 1 1 -1 -1 -1 -1 -1 -1 -1;...
       -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
       -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
       -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1];
 FIVE=imresize(five,20);
 subplot(2,5,6)
 imshow(FIVE)
 % 数字6
 six=[-1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
      -1 1 1 -1 -1 -1 -1 -1 -1 -1;-1 1 1 -1 -1 -1 -1 -1 -1 -1;...
      -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
      -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
      -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1];
 SIX=imresize(six,20);
 subplot(2,5,7)
 imshow(SIX)
% 数字7
 seven=[-1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
      -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
      -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
      -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
      -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1];
 SEVEN=imresize(seven,20);
 subplot(2,5,8)
 imshow(SEVEN)
% 数字8
 eight=[-1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
        -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
        -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
        -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
        -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1];
EIGHT=imresize(eight,20);
subplot(2,5,9)
imshow(EIGHT)
% 数字9
nine=[-1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
      -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
      -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
      -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
      -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1];
 NINE=imresize(nine,20);
 subplot(2,5,10)
 imshow(NINE)

在这里插入图片描述

clc % 清屏
clear all; % 删除workplace变量
close all; % 关掉显示图形窗口
% 标准数字
% 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];
%  
% 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];
 
 three=[-1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
       -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
        -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
       -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
       -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1];
   
    four=[-1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
      -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 -1 -1 -1 -1 1 1 -1;...
      -1 1 1 -1 -1 -1 -1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
      -1 1 1 1 1 1 1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1;...
      -1 -1 -1 -1 -1 -1 -1 1 1 -1;-1 -1 -1 -1 -1 -1 -1 1 1 -1];
  
  one=three;
  two=four;
 
% 显示标准数字图像
%数字1
 ONE=imresize(one,20);
 subplot(3,2,1)
 imshow(ONE)
 title('模板图像')
%数字2 
 TWO=imresize(two,20);
 subplot(3,2,2)
 imshow(TWO)
 title('模板图像')
 
% 创建hopfield网络
 T=[one;two]';
 net=newhop(T);
 
%  产生噪声
% 人为噪声
% no1=[-1 -1 -1 -1 1 1 -1 -1 -1 -1;-1 -1 -1 -1 1 -1 -1 -1 -1 -1;...
%     -1 -1 1 -1 1 1 -1 -1 -1 -1; -1 -1 -1 -1 1 1 1 -1 -1 -1;...
%     -1 -1 -1 -1 -1 1 -1 -1 -1 -1; -1 -1 -1 -1 1 1 -1 1 -1 -1;...
%     -1 -1 -1 -1 1 1 -1 -1 -1 -1; -1 1 -1 -1 1 1 -1 -1 -1 -1;...
%     -1 -1 -1 -1 -1 1 -1 -1 -1 -1; -1 -1 -1 -1 1 1 -1 -1 1 -1];
% 
% no2=[-1 1 1 1 -1 1 1 -1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
%     -1 -1 1 -1 1 -1 -1 1 1 -1;-1 -1 -1 1 -1 1 -1 1 1 -1;...
%     -1 1 1 1 1 1 1 1 1 -1;-1 1 1 1 1 1 1 1 1 -1;...
%     -1 1 1 -1 -1 -1 -1 -1 -1 -1;-1 1 1 -1 -1 -1 -1 -1 -1 -1;...
%     -1 1 1 1 -1 1 1 1 1 -1;-1 1 1 -1 1 1 1 1 1 -1];

% 随机噪声
rand('state',0);
for i=1:100
    a=rand;
    if a<0.1 % 加入噪声比,一般a较大,识别效果较差
       one(i)=-one(i);
       two(i)=-two(i);
    end
end
no1=one;
no2=two;
 
%  加入噪声后的数字图像
 subplot(3,2,3)
 NO1=imresize(no1,20);
 imshow(NO1)
 title('加入噪声后模板图像')
 
 subplot(3,2,4)
 NO2=imresize(no2,20);
 imshow(NO2)
 title('加入噪声后模板图像')
 
% 仿真结果
noise1={(no1)'};
tu1=sim(net,{10,10},{},noise1);
tu1{10}'
subplot(3,2,5)
imshow(imresize(tu1{10}',20))
title('识别图像')

noise2={(no2)'};
tu2=sim(net,{10,10},{},noise2);
tu2{10}'
subplot(3,2,6)
imshow(imresize(tu2{10}',20))
title('识别图像')

在这里插入图片描述

–end–

Logo

技术共进,成长同行——讯飞AI开发者社区

更多推荐