Hopfield网络及学习算法最初是由美国物理学家J.J Hopfield于1982年首先提出的,曾经为人工神经网络的发展进程开辟了新的研究途径。它利用与阶层型神经网络不同的结构特征和学习方法,模拟生物神经网络的记忆机理,获得了令人满意的结果。
Hopf
ield最早提出的网络是二值神经网络,神经元的输出只取1和0,所以,也称离散Hopfield神经网络(Discrete Hopfield Neural Network,DHNN)。在离散Hopfield网络中,所采用的神经元是二值神经元,因此,所输出的离散值1和0分别表示神经元处于激活和抑制状 态。
离散型Hopfield神经网络的结构如下图所示。
从DHNN的结构可以看出:它是一种多输入、含有阈值的二值非线性动态系统。在动态系统中,平衡稳定状态可以理解为系统某种形式的能量函数在系统运动过程 中,其能量值不断减小,最后处于最小值。Coben和Grossberg在1983年给出了关于Hopfield网络稳定的充分条件,他们指出:如果 Hopfield网络的权系数矩阵是一个对称矩阵,并且对角线元素为0,则这个网络是稳定的。应该指出,这只是Hopfield网络稳定的充分条件,而不 是必要条件。在实际中有很多稳定的Hopfield网络,但是它们并不满足权系数矩阵 是对称矩阵这一条件。
第二部分 工具箱讲解
Hopfield神经网络工具箱主要包括newhop和sim函数。
1 newhop
函数功能:创建一个离散型Hopfield网络。
调用格式:net=newhop(T);
T:具有Q个目标向量的R*Q矩阵(元素必须为-1或1);
net:生成的神经网络,具有在T中的向量上稳定的点。
2 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的场合,元胞数组形式常用于一些没有输入信号的神经网络。
第三部分 程序示范
第二部分 工具箱讲解
Hopfield神经网络工具箱主要包括newhop和sim函数。
1 newhop
函数功能:创建一个离散型Hopfield网络。
调用格式:net=newhop(T);
T:具有Q个目标向量的R*Q矩阵(元素必须为-1或1);
net:生成的神经网络,具有在T中的向量上稳定的点。
2 sim
函数功能:对训练好的神经网络进行仿真。
调用格式:[Y,Af,E,perf] = sim(net,P,Ai,T)
P,Q:测试向量的个数;
Ai:初始的层延时,默认为0;
T:测试向量;
TS:测试的步数;
Y:网络的输出矢量;
Af:训练终止时的层延迟状态;
E:误差矢量;
perf:网络的性能。
说明:函数中用到的参数采取了两种不同的形式进行表示:矩阵和元胞数组。矩阵的形式只用于仿真的时间步长TS=1的场合,元胞数组形式常用于一些没有输入信号的神经网络。
第三部分 程序示范
- % ------------------------------number 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;-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 1 1 1 1 1 1 1 1 -1;...
-
-1 -1 -1 -1 -1 -1 -1 -1 -1 -1];
- %
--------------------------plot standard number figure--------------
- subplot(2,3,1)
- imshow(imresize(one,20))
- title('standard number')
-
- subplot(2,3,4)
- imshow(imresize(two,20))
- title('standard number')
- % ---------------------------creat hopfield net---------------------
- T=[one;two]';
- net=newhop(T);
- % --------------------------generate rand noise------------------
- for i=2:11
-
for j=2:9
-
a=rand;
-
if a<=0.1
-
one(i,j)=-one(i,j);
-
two(i,j)=-two(i,j);
-
end
-
end
- end
- noise_one=one
- noise_two=two
- % -------------------------plot noise figure----------------------------
- subplot(2,3,2)
- imshow(imresize(noise_one,20))
- title('noise number')
-
- subplot(2,3,5)
- imshow(imresize(noise_two,20))
- title('noise number')
- % ------------------------plot identify figure---------------------------
- noise1={(noise_one)'};
- tu1=sim(net,{12,3},{},noise1);
- tu1{3}'
- subplot(2,3,3)
- imshow(imresize(tu1{3}',20))
- title('identify number')
-
- noise2={(noise_two)'};
- tu2=sim(net,{12,3},{},noise2);
- tu2{3}'
- subplot(2,3,6)
- imshow(imresize(tu2{3}',20))
- title('identify number')