【数字识别】基于Hopfield神经网络识别0-9数字附Matlab代码
1 内容介绍
自1943年 McCulloch和 Pitts首次提出了人工神经元模型以来,新的神经元模型及其组成的神经网络不断被提出,已成为目前非线性科学和计算智能研究的一个主要研究方向。其中,神经网络图像识别技术随着当代计算机技术、图像处理、人工智能、模式识别理论等快速发展,是传统图像识别方法与神经网络算法相融合的一种图像识别方法[3-4]。利用神经网络进行字符识别在计算机识别领域占有越来越重要的地位,并且广泛应用于雾天或者夜晚的交通车牌识别、机器视觉等实际应用领域。近些年来,利用 Hopfield神经网络识别噪声字符、汽车牌照字符等实例表明这种方法识别率高、鲁 棒 性 好 且 具 有 很 好 的 实 用 性:例 如 朱 献 文[5]研究 了 基 于 遗 传 算 法Hopfield神经网络的字符识别方法;魏武[6]等人对车牌字符识别模板匹配的神经网络方法进行改进;丘敏[7]等人在汽车牌照字符识别的应用中将 Hopfield和 BP网络结合使用提高了识别率;Tatem[8]等人利用了 Hopfield神经网络识别遥感图像中的土地覆盖目标。以上关于字符识别的研究都把噪声作为有害因素,专注于噪声的消除,而忽视了噪声的有益作用,实际上噪声可以增强神经元信息处理能力,即神经科学中的随机共振现象[9-11]。最近,Hopfield神经网络的随机共振现象研究已取得了重大进展,如 Katada[9]等人研究了 Hopfield网络中随机共振现象,并扩展到包含156个神经元的网络中;Pinamonti[10]等人研究了复杂网络中多峰随机共振的重要特征;Nishimura[11]等人研究了由3个神经元构成的神经网络中随机共振型反馈,将它作为有效的混沌动力学的双势阱模型。本文主要利用离散 Hopfield神经网络识别手写数字,将被识别的图像二进制编码变成串行编码,根据信号在稳态间回环往复的规律输入到 Hopfield神经元网络中,不仅研究输入信号幅值调制,码间间隔以及神经元耦合个数对于网络识别图像的影响,还研究了传输过程中噪声强度与图像识别误码率的非线性特性Hopfield神经网络是由 Hopfield[12-13]于1982年首先提出的一种单层的、输出为二值的全连接型的反馈神经 网络。离散 Hopfield神经网络只有一个神经元层,第0层仅作为网络的输入,并无计算功能,而第1层是神经元 层,用于对输入数据和权系数的乘积求累加和,并经非线性激活函数处理后产生输出信息。该网络模拟生物神经 网络的记忆机制,具有联想记忆的功能。3个神经元构成的离散 Hopfield神经网络可以用加权无向图表示,如图 1所示。 图1 离散型 Hopfield神经网络结构 Fig.1 Architectureofdiscreteneuralnetworks 从图1可以看出神经元间是相互联系的,并且网 络中每一个神经元的输出都反馈到其他神经元上,每 条边上权值表示有关神经元之间的连接强度,每个节 点代表一个神经元且附有一个阈值,当某神经元所受 到的刺激超过其阈值时,神经元就处于激活状态,否则 神经元就处于静息状态。我们取神经元激活函数[9]为
2 仿真代码
function out1 = newhop(varargin)
%NEWHOP Design a Hopfield recurrent network.
%
% Hopfield networks perform a kind of pattern recall. They are included
% primarily for historical purposes. For more robust pattern recognition
% use <a href="matlab:doc patternnet">patternnet</a>.
%
% <a href="matlab:doc newhop">newhop</a>(T) takes an RxQ matrix of Q target vectors T with element
% values of +1 or -1, and returns a new Hopfield recurrent neural
% network with stable points at the vectors in T.
%
% Here a Hopfield network with two three-element stable points is
% designed and simulated.
%
% T = [-1 -1 1; 1 -1 1]';
% net = <a href="matlab:doc newhop">newhop</a>(T);
% Ai = T;
% [Y,Pf,Af] = net(2,[],Ai)
%
% To see if the network can correct a corrupted vector, run
% the following code which simulates the Hopfield network for
% five timesteps. (Since Hopfield networks have no inputs,
% the second argument to SIM is {Q TS} = [1 5] when using cell
% array notation.)
%
% Ai = {[-0.9; -0.8; 0.7]};
% [Y,Pf,Af] = net({1 5},{},Ai);
% Y{1}
%
% If you run the above code Y{1} will equal T(:,1) if the
% network has managed to convert the corrupted vector Ai to
% the nearest target vector.
%
% See also SIM, SATLINS.
% Mark Beale, 11-31-97
% Copyright 1992-2011 The MathWorks, Inc.
%% =======================================================
% BOILERPLATE_START
% This code is the same for all Network Functions.
persistent INFO;
if isempty(INFO), INFO = get_info; end
if (nargin > 0) && ischar(varargin{1}) ...
&& ~strcmpi(varargin{1},'hardlim') && ~strcmpi(varargin{1},'hardlims')
code = varargin{1};
switch code
case 'info',
out1 = INFO;
case 'check_param'
err = check_param(varargin{2});
if ~isempty(err), nnerr.throw('Args',err); end
out1 = err;
case 'create'
if nargin < 2, error(message('nnet:Args:NotEnough')); end
param = varargin{2};
err = nntest.param(INFO.parameters,param);
if ~isempty(err), nnerr.throw('Args',err); end
out1 = create_network(param);
out1.name = INFO.name;
otherwise,
% Quick info field access
try
out1 = eval(['INFO.' code]);
catch %#ok<CTCH>
nnerr.throw(['Unrecognized argument: ''' code ''''])
end
end
else
[args,param] = nnparam.extract_param(varargin,INFO.defaultParam);
[param,err] = INFO.overrideStructure(param,args);
if ~isempty(err), nnerr.throw('Args',err,'Parameters'); end
net = create_network(param);
net.name = INFO.name;
out1 = init(net);
end
end
function v = fcnversion
v = 7;
end
% BOILERPLATE_END
%% =======================================================
function info = get_info
info = nnfcnNetwork(mfilename,'Hopfield Network',fcnversion, ...
[ ...
nnetParamInfo('targets','Target Data','nntype.data',{1},...
'Target output data.'), ...
]);
end
function err = check_param(param)
err = '';
end
function net = create_network(param)
% Format
t = param.targets;
if iscell(t), t = cell2mat(t); end
% CHECKING
if (~isa(t,'double')) || ~isreal(t) || isempty(t)
error(message('nnet:NNData:TargetsNotRealNonEmpty'));
end
% DIMENSIONS
[S,Q] = size(t);
% NETWORK PARAMETERS
[w,b] = solvehop2(t);
% NETWORK ARCHITECTURE
net = network(0,1,[1],[],[1],[1]);
% RECURRENT LAYER
net.layers{1}.size = S;
net.layers{1}.transferFcn = 'satlins';
net.b{1} = b;
net.lw{1,1} = w;
net.layerWeights{1,1}.delays = 1;
end
%==========================================================
function [w,b] = solvehop2(t)
[S,Q] = size(t);
Y = t(:,1:Q-1)-t(:,Q)*ones(1,Q-1);
[U,SS,V] = svd(Y);
K = rank(SS);
TP = zeros(S,S);
for k=1:K
TP = TP + U(:,k)*U(:,k)';
end
TM = zeros(S,S);
for k=K+1:S
TM = TM + U(:,k)*U(:,k)';
end
tau = 10;
Ttau = TP - tau*TM;
Itau = t(:,Q) - Ttau*t(:,Q);
h = 0.15;
C1 = exp(h)-1;
C2 = -(exp(-tau*h)-1)/tau;
w = expm(h*Ttau);
b = U * [ C1*eye(K) zeros(K,S-K);
zeros(S-K,K) C2*eye(S-K)] * U' * Itau;
end
%=
1 内容介绍
自1943年 McCulloch和 Pitts首次提出了人工神经元模型以来,新的神经元模型及其组成的神经网络不断被提出,已成为目前非线性科学和计算智能研究的一个主要研究方向。其中,神经网络图像识别技术随着当代计算机技术、图像处理、人工智能、模式识别理论等快速发展,是传统图像识别方法与神经网络算法相融合的一种图像识别方法[3-4]。利用神经网络进行字符识别在计算机识别领域占有越来越重要的地位,并且广泛应用于雾天或者夜晚的交通车牌识别、机器视觉等实际应用领域。近些年来,利用 Hopfield神经网络识别噪声字符、汽车牌照字符等实例表明这种方法识别率高、鲁 棒 性 好 且 具 有 很 好 的 实 用 性:例 如 朱 献 文[5]研究 了 基 于 遗 传 算 法Hopfield神经网络的字符识别方法;魏武[6]等人对车牌字符识别模板匹配的神经网络方法进行改进;丘敏[7]等人在汽车牌照字符识别的应用中将 Hopfield和 BP网络结合使用提高了识别率;Tatem[8]等人利用了 Hopfield神经网络识别遥感图像中的土地覆盖目标。以上关于字符识别的研究都把噪声作为有害因素,专注于噪声的消除,而忽视了噪声的有益作用,实际上噪声可以增强神经元信息处理能力,即神经科学中的随机共振现象[9-11]。最近,Hopfield神经网络的随机共振现象研究已取得了重大进展,如 Katada[9]等人研究了 Hopfield网络中随机共振现象,并扩展到包含156个神经元的网络中;Pinamonti[10]等人研究了复杂网络中多峰随机共振的重要特征;Nishimura[11]等人研究了由3个神经元构成的神经网络中随机共振型反馈,将它作为有效的混沌动力学的双势阱模型。本文主要利用离散 Hopfield神经网络识别手写数字,将被识别的图像二进制编码变成串行编码,根据信号在稳态间回环往复的规律输入到 Hopfield神经元网络中,不仅研究输入信号幅值调制,码间间隔以及神经元耦合个数对于网络识别图像的影响,还研究了传输过程中噪声强度与图像识别误码率的非线性特性Hopfield神经网络是由 Hopfield[12-13]于1982年首先提出的一种单层的、输出为二值的全连接型的反馈神经 网络。离散 Hopfield神经网络只有一个神经元层,第0层仅作为网络的输入,并无计算功能,而第1层是神经元 层,用于对输入数据和权系数的乘积求累加和,并经非线性激活函数处理后产生输出信息。该网络模拟生物神经 网络的记忆机制,具有联想记忆的功能。3个神经元构成的离散 Hopfield神经网络可以用加权无向图表示,如图 1所示。 图1 离散型 Hopfield神经网络结构 Fig.1 Architectureofdiscreteneuralnetworks 从图1可以看出神经元间是相互联系的,并且网 络中每一个神经元的输出都反馈到其他神经元上,每 条边上权值表示有关神经元之间的连接强度,每个节 点代表一个神经元且附有一个阈值,当某神经元所受 到的刺激超过其阈值时,神经元就处于激活状态,否则 神经元就处于静息状态。我们取神经元激活函数[9]为
2 仿真代码
function out1 = newhop(varargin)
%NEWHOP Design a Hopfield recurrent network.
%
% Hopfield networks perform a kind of pattern recall. They are included
% primarily for historical purposes. For more robust pattern recognition
% use <a href="matlab:doc patternnet">patternnet</a>.
%
% <a href="matlab:doc newhop">newhop</a>(T) takes an RxQ matrix of Q target vectors T with element
% values of +1 or -1, and returns a new Hopfield recurrent neural
% network with stable points at the vectors in T.
%
% Here a Hopfield network with two three-element stable points is
% designed and simulated.
%
% T = [-1 -1 1; 1 -1 1]';
% net = <a href="matlab:doc newhop">newhop</a>(T);
% Ai = T;
% [Y,Pf,Af] = net(2,[],Ai)
%
% To see if the network can correct a corrupted vector, run
% the following code which simulates the Hopfield network for
% five timesteps. (Since Hopfield networks have no inputs,
% the second argument to SIM is {Q TS} = [1 5] when using cell
% array notation.)
%
% Ai = {[-0.9; -0.8; 0.7]};
% [Y,Pf,Af] = net({1 5},{},Ai);
% Y{1}
%
% If you run the above code Y{1} will equal T(:,1) if the
% network has managed to convert the corrupted vector Ai to
% the nearest target vector.
%
% See also SIM, SATLINS.
% Mark Beale, 11-31-97
% Copyright 1992-2011 The MathWorks, Inc.
%% =======================================================
% BOILERPLATE_START
% This code is the same for all Network Functions.
persistent INFO;
if isempty(INFO), INFO = get_info; end
if (nargin > 0) && ischar(varargin{1}) ...
&& ~strcmpi(varargin{1},'hardlim') && ~strcmpi(varargin{1},'hardlims')
code = varargin{1};
switch code
case 'info',
out1 = INFO;
case 'check_param'
err = check_param(varargin{2});
if ~isempty(err), nnerr.throw('Args',err); end
out1 = err;
case 'create'
if nargin < 2, error(message('nnet:Args:NotEnough')); end
param = varargin{2};
err = nntest.param(INFO.parameters,param);
if ~isempty(err), nnerr.throw('Args',err); end
out1 = create_network(param);
out1.name = INFO.name;
otherwise,
% Quick info field access
try
out1 = eval(['INFO.' code]);
catch %#ok<CTCH>
nnerr.throw(['Unrecognized argument: ''' code ''''])
end
end
else
[args,param] = nnparam.extract_param(varargin,INFO.defaultParam);
[param,err] = INFO.overrideStructure(param,args);
if ~isempty(err), nnerr.throw('Args',err,'Parameters'); end
net = create_network(param);
net.name = INFO.name;
out1 = init(net);
end
end
function v = fcnversion
v = 7;
end
% BOILERPLATE_END
%% =======================================================
function info = get_info
info = nnfcnNetwork(mfilename,'Hopfield Network',fcnversion, ...
[ ...
nnetParamInfo('targets','Target Data','nntype.data',{1},...
'Target output data.'), ...
]);
end
function err = check_param(param)
err = '';
end
function net = create_network(param)
% Format
t = param.targets;
if iscell(t), t = cell2mat(t); end
% CHECKING
if (~isa(t,'double')) || ~isreal(t) || isempty(t)
error(message('nnet:NNData:TargetsNotRealNonEmpty'));
end
% DIMENSIONS
[S,Q] = size(t);
% NETWORK PARAMETERS
[w,b] = solvehop2(t);
% NETWORK ARCHITECTURE
net = network(0,1,[1],[],[1],[1]);
% RECURRENT LAYER
net.layers{1}.size = S;
net.layers{1}.transferFcn = 'satlins';
net.b{1} = b;
net.lw{1,1} = w;
net.layerWeights{1,1}.delays = 1;
end
%==========================================================
function [w,b] = solvehop2(t)
[S,Q] = size(t);
Y = t(:,1:Q-1)-t(:,Q)*ones(1,Q-1);
[U,SS,V] = svd(Y);
K = rank(SS);
TP = zeros(S,S);
for k=1:K
TP = TP + U(:,k)*U(:,k)';
end
TM = zeros(S,S);
for k=K+1:S
TM = TM + U(:,k)*U(:,k)';
end
tau = 10;
Ttau = TP - tau*TM;
Itau = t(:,Q) - Ttau*t(:,Q);
h = 0.15;
C1 = exp(h)-1;
C2 = -(exp(-tau*h)-1)/tau;
w = expm(h*Ttau);
b = U * [ C1*eye(K) zeros(K,S-K);
zeros(S-K,K) C2*eye(S-K)] * U' * Itau;
end
%==========================================================
3 运行结果
4 参考文献
[1]王小峰. 基于离散Hopfield神经网络的数字识别研究[J]. 忻州师范学院学报, 2012, 028(002):21-24.
[2]任东红, 林鹏, and 袁清萍. "基于离散Hopfield神经网络的数字模式识别." 现代职业教育 14(2018):1.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
=========================================================
3 运行结果
4 参考文献
[1]王小峰. 基于离散Hopfield神经网络的数字识别研究[J]. 忻州师范学院学报, 2012, 028(002):21-24.
[2]任东红, 林鹏, and 袁清萍. "基于离散Hopfield神经网络的数字模式识别." 现代职业教育 14(2018):1.
博主简介:擅长智能优化算法、神经网络预测、信号处理、元胞自动机、图像处理、路径规划、无人机等多种领域的Matlab仿真,相关matlab代码问题可私信交流。
部分理论引用网络文献,若有侵权联系博主删除。
【数字识别】基于Hopfield神经网络识别0-9数字附Matlab代码相关推荐
- 【语音识别】基于BP神经网络实现语音特征信号分类附matlab代码
✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信.
- 基于YOLOv4的目标检测系统(附MATLAB代码+GUI实现)
摘要:本文介绍了一种MATLAB实现的目标检测系统代码,采用 YOLOv4 检测网络作为核心模型,用于训练和检测各种任务下的目标,并在GUI界面中对各种目标检测结果可视化.文章详细介绍了YOLOv4的 ...
- Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法(附Matlab代码)
Caputo 分数阶一维问题基于 L1 逼近的空间二阶方法 Caputo 分数阶一维问题基于 L1 逼近的快速差分方法(附Matlab程序) 文章目录 Caputo 分数阶一维问题基于 L1 逼近的空 ...
- 【预测模型-GRNN预测】基于有限增量进化广义回归神经网络LIEV-GRNN实现数据回归预测附matlab代码
1 内容介绍 在本文中,基于有限增量进化和基于距离的剪枝对在线模型动态系统开发了一种进化一般回归神经网络.此外,建议使用基于方差的方法来调整 GRNN 中的平滑参数以适应在线应用.将所提出的模型与不 ...
- 基于BP神经网络的电力负荷预测(Matlab代码实现)
目录 1 概述 2 运行结果 3 完整Matlab代码实现 4 数据 1 概述 随着电力工业逐步进入市场化,区域配电网短期电力负荷预测在电力行业中地位越来越重要,精准的短期负荷预测方法对电力系统安全稳 ...
- 【图像增强】基于Step和Polynomial 滤波实现图像增强附matlab代码
1 内容介绍 本文提出的Step过滤和多项式过滤方法的实现 提供对部分曲线结构的增强. 该方法应用于地球物理图像,以识别线性模式存在于考古遗址 [1] 和故障检测 [2] 中的地下建筑结构.该方法有 ...
- 【图像检测】基于Itti模型实现图像显著性检测附matlab代码
1 简介 视觉显著性计算模型以心理学.神经科学.认知理论等领域的研究成果或假说为前提,建立数学模型来模拟人类视觉系统指引注意力分配和视觉认知的过程,通过模拟和仿真人类视觉感知机理,将存在待检测目标的人 ...
- 【优化求解】基于蝗虫算法求解单目标问题附matlab代码
1 简介 蝗虫算法( Grasshopper Optimization Algorithm,GOA ) 是 由 Saremi 等[1]于2017 年提出的一种元启发式仿生优化算法.具体原理如下: 2 ...
- 【图像分割】基于麻雀算法优化Kmeans实现图像分割附Matlab代码
1 内容介绍 提出一种基于K-Means聚类的麻雀算法,该算法利用麻雀算法鲁棒性较强且不易陷入局部最优值的特点,动态的确定了聚类的数目和中心,解决了K-Means聚类初始点选择不稳定的缺陷,在此两种算 ...
最新文章
- 障碍期权定价 python_[宜配屋]听图阁
- 大小端字节序介绍以及判断当前环境字节序的程序【C语言】
- 周期串 字符串的最小正周期
- IM开发基础知识补课(四):正确理解HTTP短连接中的Cookie、Session和Token
- Hibernate环境搭建以及HelloWorld
- C++笔记(2017/2/9)
- vue中,format与value-format比较
- wap base.inc.php,MetInfo database.inc.php配置
- Octopus系列之更新历史记录
- c 语言表达式求值中缀变后缀,表达式求值关于中缀式转后缀式的问题!
- dubbo+zookeeper+dubboadmin环境搭建
- C/C++[codeup 2064]编排字符串
- 返回链表的中间结点,若中间有两个结点,则返回后一个结点(两种方法)
- C++实现龙贝格求积分算法
- 客户服务管理(CSM)
- torch.nn.functional.cosine_similarity使用详解
- BZOJ 4698 Sdoi2008 Sandy的卡片
- mysql limt取指定数据条数 top取指定数据条数
- Linux系统编程:串口编程
- 服务器网站崩溃怎么解决
热门文章
- 手动证书管理与自动证书管理
- win10网络能连接,但是出现黄色感叹号的解决办法
- 一次关于读写锁的探索
- PyCharm 主题和字体 (Scheme Editor Font)
- android studio 提示ABIs [arm64-v8a,armeabi-v7a,armeabi] set by ‘android.injected.build.abi’ gradle fla
- 彻底删除 Windows Defender 这个垃圾
- webgl是什么意思
- C++11日志之spdlog
- Linux下开启和关闭Telnet服务
- excel排名次函数