手写数字识别基于matlab GUI RBM神经网络手写数字识别含Matlab源码 1109期
Posted 紫极神光(Q1564658423)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了手写数字识别基于matlab GUI RBM神经网络手写数字识别含Matlab源码 1109期相关的知识,希望对你有一定的参考价值。
一、简介
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 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激活函数。即:
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);
三、运行结果
四、备注
版本:2014a
以上是关于手写数字识别基于matlab GUI RBM神经网络手写数字识别含Matlab源码 1109期的主要内容,如果未能解决你的问题,请参考以下文章
手写数字识别基于BP神经网络手写数字识别matlab源码含GUI
手写数字识别基于matlab GUI BP神经网络手写数字识别系统含Matlab源码 1639期
手写数字识别基于matlab GUI BP神经网络单个或连续手写数字识别系统含Matlab源码 2296期
手写数字识别基于matlab GUI BP神经网络单个或连续手写数字识别系统含Matlab源码 2296期