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