离散Hopfield网络视频(DHNN):链接:http://pan.baidu.com/s/1dELyRZF 密码:ssew
连续Hopfield网络视频(CHNN):链接:http://pan.baidu.com/s/1jHYfRHs 密码:mn7j
视频资料:
【1】hopfield视频课件及程序:链接:http://pan.baidu.com/s/1mh6ry3Y 密码:x9bk
【2】TSP_hopfield:链接:http://pan.baidu.com/s/1kVd32IF 密码:ag92
1 Hopfield网络原理分析
Hopfield网络是神经网络发展历史上的一个重要的里程碑。由美国加州理工学院物理学家J.J.Hopfield教授于1982年提出,是一种单层反馈神经网络。 1984年,Hopfield设计并研制了网络模型的电路,并成功地解决了旅行商(TSP)计算难题(优化问题)。 Hopfield网络是一种互连型网络,它引入类似于切Lyapunov函数的能量函数概念,在满足条件的情况下,某种“能量函数”的能量在网络运行过程中不断地减少,最后趋于稳定的平衡状态。对于一个非线性动力学系统,系统的状态从某一初值出发经过演变后可能有如下几种结果:渐进稳定点(吸引子)、极限环、混沌、状态发散。 因为人工神经网络的变换函数是一个有界函数,故系统的状态不会发生发散现象。目前,人工神经网络经常利用渐进稳定点来解决某些问题。如果把系统的稳定点视为一个记忆的话,那么从初态朝这个稳定点的演变过程就是一个寻找记忆的过程。如果把系统的稳定点视为一个能量函数的极小点,而把能量函数视为一个优化问题的目标函数,那么从初态朝这个稳定点的演变过程就是一个求解该优化问题的过程。因此,HoPfield神经网络的演变过程是一个计算联想记忆或求解优化问题的过程。实际上,它的解决并不需要真的去计算,而是通过构成反馈神经网络,适当地设计其连接权和输入就可以达到这个目的。 Hopfield神经网络模型是一种循环神经网络,从输出到输入有反馈连接。在输入的激励下,会产生不断的状态变化。对于一个Hopfield网络来说,关键是在于确定它在稳定条件下的权系数。反馈网络有稳定的,也有不稳定的。对于Hopfield网络来说,如何判别其稳定性也是需要确定的。 2 Hopfield数字识别 人工神经网络有很多种,常见的有BP神经网络、RBF神经网络、SOM神经网络等,每种神经网络根据算法特点应用于不同的领域,常见人工神经网络应用分类如表1所示。 Hopfield神经网络模型如图26-1所示,它是一种循环神经网络,从输出到输入有反馈连接,通过不断的调整权值,使得系统能量函数不断的趋向于最小,达到系统收敛的目的。 Hopfield神经网络模型图 2.1 离散Hopfield网络(DHNN)
对于离散Hopfield网络(DHNN)而言,神经元的输出只取1和0,分别表示神经元处于激活和抑制状态。对于二值神经元,它的计算公式如下: u = sum( w*y ) + x 其中,y 为外部输入。并且有: y = 1, u>=0 y = 0, u<0 一个DHNN的网络状态是输出神经元信息的集合。对于一个输出层是n个神经元的网络,其 t 时刻的状态为一个n维向量: Y(t) = [y1(t), y2(t), ……,yn(t) ] 因为y(t)可以取值为1或0,故n维向量Y(t)有 2^n 种状态,即网络有 2^n 种状态。 如果Hopfield网络是一个稳定网络,若在网络的输入端加入一个输入向量,则网络的状态会产生变化,如图所示,即从超立方体的一个顶点转向另一个顶点,并且最终稳定于一个特定的顶角。
Hopfield网络状态节点图 Y(t) = [y1(t), y2(t), ……,yn(t) ] 如果对于任何dt,当神经网络从t=0开始,有初始状态Y(0) 。经过有限时刻t,有: Y(t+dt) = Y(t) 则称网络是稳定的。 2.2 连续Hopfield网络 对于连续Hopfield网络(CHNN)而言,拓扑结构和DHNN的结构相同。不同之处在于其函数g不是阶跃函数,而是S形的连续函数。一般取: g(u) = 1/( 1+exp(u) )
网络创建函数newhop()如下: net=newhop(T) T—R*Q,Q为目标向量个数 传递函数satlin()、satlins(),网络仿真函数sim()如下: [Y,Pf,Af,E,perf]=sim(net,P,Pi,Ai,T) [Y,Pf,Af,E,perf]=sim(net,{Q TS},Pi,Ai,T) 传递函数satlin()、satlins()示意图如图所示。 传递函数 2.3 基于DHNN的数字识别 用离散Hopfield网络,使其具有联想记忆功能,能正确识别阿拉伯数字,当数字被噪声污染后仍可以正确地识别。 假设网络由0-9共10个稳态构成,每个稳态由10x10的矩阵构成,该矩阵用于模拟阿拉伯数字点阵。即将数字划分成10x10方阵,有数字的部分用1表示,空白处用-1表示。
数字点阵图像 构造相应的0-9数字点阵,编写MATLAB程序如下: - 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)
复制代码构造Hopfield网络对数字加入噪声进行识别,编写程序如下: - 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];
- % 显示标准数字图像
- %数字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('识别图像')
复制代码
|