【手写数字识别】基于matlab GUI RBM神经网络手写数字识别【含Matlab源码 1109期】

举报
海神之光 发表于 2022/05/29 02:13:48 2022/05/29
【摘要】 一、手写数字识别技术简介 1 案例背景 手写体数字识别是图像识别学科下的一个分支,是图像处理和模式识别研究领域的重要应用之一,并且具有很强的通用性。由于手写体数字的随意性很大,如笔画粗细、字体大小、倾斜...

一、手写数字识别技术简介

1 案例背景
手写体数字识别是图像识别学科下的一个分支,是图像处理和模式识别研究领域的重要应用之一,并且具有很强的通用性。由于手写体数字的随意性很大,如笔画粗细、字体大小、倾斜角度等因素都有可能直接影响到字符的识别准确率,所以手写体数字识别是一个很有挑战性的课题。在过去的数十年中,研究者们提出了许多识别方法,并取得了一定的成果。手写体数字识别的实用性很强,在大规模数据统计如例行年检、人口普查、财务、税务、邮件分拣等应用领域都有广阔的应用前景"。
本案例讲述了图像中手写阿拉伯数字的识别过程,对手写数字识别的基于统计的方法进行了简要介绍和分析,并通过开发一个小型的手写体数字识别系统来进行实验。

2 RBM神经网络
2.1 RBM模型结构
玻尔兹曼机是一大类的神经网络模型,但是在实际应用中使用最多的则是RBM。RBM本身模型很简单,只是一个两层的神经网络,因此严格意义上不能算深度学习的范畴。不过深度玻尔兹曼机(Deep Boltzmann Machine,以下简称DBM)可以看做是RBM的推广。理解了RBM再去研究DBM就不难了,因此本文主要关注于RBM。

回到RBM的结构,它是一个个两层的神经网络,如下图所示:
在这里插入图片描述
上面一层神经元组成隐藏层(hidden layer), 用h向量隐藏层神经元的值。下面一层的神经元组成可见层(visible layer),用v向量表示可见层神经元的值。隐藏层和可见层之间是全连接的,这点和DNN类似, 隐藏层神经元之间是独立的,可见层神经元之间也是独立的。连接权重可以用矩阵W表示。和DNN的区别是,RBM不区分前向和反向,可见层的状态可以作用于隐藏层,而隐藏层的状态也可以作用于可见层。隐藏层的偏倚系数是向量b,而可见层的偏倚系数是向量a。

常用的RBM一般是二值的,即不管是隐藏层还是可见层,它们的神经元的取值只为0或者1。本文只讨论二值RBM。

总结下RBM模型结构的结构:主要是权重矩阵W, 偏倚系数向量a和b,隐藏层神经元状态向量h和可见层神经元状态向量v。

2.2 RBM概率分布
RBM是基于基于能量的概率分布模型。怎么理解呢?分两部分理解,第一部分是能量函数,第二部分是基于能量函数的概率分布函数。

对于给定的状态向量h和v,则RBM当前的能量函数可以表示为:
在这里插入图片描述
有了能量函数,则我们可以定义RBM的状态为给定v,h的概率分布为:
在这里插入图片描述
其中Z为归一化因子,类似于softmax中的归一化因子,表达式为:
在这里插入图片描述
有了概率分布,我们现在来看条件分布P(h|v):
在这里插入图片描述
其中Z′为新的归一化系数,表达式为:
在这里插入图片描述
同样的方式,我们也可以求出P(v|h),这里就不再列出了。
有了条件概率分布,现在我们来看看RBM的激活函数,提到神经网络,我们都绕不开激活函数,但是上面我们并没有提到。由于使用的是能量概率模型,RBM的基于条件分布的激活函数是很容易推导出来的。我们以P(hj=1|v)为例推导如下。
在这里插入图片描述
从上面可以看出, RBM里从可见层到隐藏层用的其实就是sigmoid激活函数。同样的方法,我们也可以得到隐藏层到可见层用的也是sigmoid激活函数。即:
在这里插入图片描述
2.3 RBM模型的损失函数与优化
RBM模型的关键就是求出我们模型中的参数W,a,b。如果求出呢?对于训练集的m个样本,RBM一般采用对数损失函数,即期望最小化下式:
在这里插入图片描述
对于优化过程,我们是首先想到的当然是梯度下降法来迭代求出W,a,b。我们首先来看单个样本的梯度计算, 单个样本的损失函数为:−ln(P(V)), 我们先看看−ln(P(V))具体的内容:
在这里插入图片描述
注意,这里面V表示的是某个特定训练样本,而v指的是任意一个样本。

我们以ai的梯度计算为例:
在这里插入图片描述
其中用到了:
在这里插入图片描述
同样的方法,可以得到W,b的梯度。这里就不推导了,直接给出结果:
在这里插入图片描述
虽然梯度下降法可以从理论上解决RBM的优化,但是在实际应用中,由于概率分布的计算量大,因为概率分布有2^nv+nh种情况, 所以往往不直接按上面的梯度公式去求所有样本的梯度和,而是用基于MCMC的方法来模拟计算求解每个样本的梯度损失再求梯度和,常用的方法是基于Gibbs采样的对比散度方法来求解,对于对比散度方法,由于需要MCMC的知识,这里就不展开了。

二、部分源代码

function varargout = core_Test_gui2(varargin)
% CORE_TEST_GUI2 MATLAB code for core_Test_gui2.fig
%      CORE_TEST_GUI2, by itself, creates a new CORE_TEST_GUI2 or raises the existing
%      singleton*.
%
%      H = CORE_TEST_GUI2 returns the handle to a new CORE_TEST_GUI2 or the handle to
%      the existing singleton*.
%
%      CORE_TEST_GUI2('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in CORE_TEST_GUI2.M with the given input arguments.
%
%      CORE_TEST_GUI2('Property','Value',...) creates a new CORE_TEST_GUI2 or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before core_Test_gui2_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to core_Test_gui2_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help core_Test_gui2

% Last Modified by GUIDE v2.5 17-Apr-2021 07:50:14

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @core_Test_gui2_OpeningFcn, ...
                   'gui_OutputFcn',  @core_Test_gui2_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before core_Test_gui2 is made visible.
function core_Test_gui2_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to core_Test_gui2 (see VARARGIN)

% Choose default command line output for core_Test_gui2
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes core_Test_gui2 wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = core_Test_gui2_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;



function result_Callback(hObject, eventdata, handles)
% hObject    handle to result (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Hints: get(hObject,'String') returns contents of result as text
%        str2double(get(hObject,'String')) returns contents of result as a double


% --- Executes during object creation, after setting all properties.
function result_CreateFcn(hObject, eventdata, handles)
% hObject    handle to result (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    empty - handles not created until after all CreateFcns called

% Hint: edit controls usually have a white background on Windows.
%       See ISPC and COMPUTER.
if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in classify.
function classify_Callback(hObject, eventdata, handles)
% hObject    handle to classify (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
 data = handles.data;
  data_new=[data data];

  load linear_classify_weights2;% w1为(2*22*22+1)*256,w_class为(256+1)*10
  
  N=1; %每次只有1幅图像测试
  %下面的计算方式通过矩阵拼凑,把偏置的计算也融入矩阵中
  dataprobs = [data_new ones(N,1)]; %融入偏置后dataprobs为1*(2*22*22+1)
  w1probs = (dataprobs*w1)>0; %未融入偏置时w1probs为1*256
  w1probs = [w1probs  ones(N,1)];%融入偏置后,w1probs为1*(256+1)
  targetout = exp(w1probs*w_class);%输出层为0*10
  
  
  %将输出层输出100*10,除以每行的总和以求得归一化比值
  targetout = targetout./repmat(sum(targetout,2),1,10);
  
  %比较每行中的最大产生10*1的列向量,I每行最大值,J每行最大值序号,
  %代表识别的数字结果,1-10(分别代表数字0-9[I J]=max(targetout,[],2);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122

三、运行结果

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四、matlab版本及参考文献

1 matlab版本
2014a

2 参考文献
[1] 蔡利梅.MATLAB图像处理——理论、算法与实例分析[M].清华大学出版社,2020.
[2]杨丹,赵海滨,龙哲.MATLAB图像处理实例详解[M].清华大学出版社,2013.
[3]周品.MATLAB图像处理与图形用户界面设计[M].清华大学出版社,2013.
[4]刘成龙.精通MATLAB图像处理[M].清华大学出版社,2015.

文章来源: qq912100926.blog.csdn.net,作者:海神之光,版权归原作者所有,如需转载,请联系作者。

原文链接:qq912100926.blog.csdn.net/article/details/118539772

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。