[手書き数字認識]matlabGUIBPニューラルネットワークに基づく手書き数字認識[Matlabソースコード1118を含む]

1.はじめに

1概要BP(Back Propagation)ニューラルネットワークは、1986年にRumelhartとMcCellandが率いる研究グループによって提案されました。Natureに掲載された彼らの論文「バックプロパゲーションエラーによる表現の学習」を参照してください。

BPニューラルネットワークは、エラーバックプロパゲーションアルゴリズムによってトレーニングされた多層フィードフォワードネットワークであり、最も広く使用されているニューラルネットワークモデルの1つです。BPネットワークは、このマッピング関係を説明する数式を事前に明らかにすることなく、多数の入出力パターンマッピング関係を学習して保存できます。その学習ルールは、最急降下法を使用して、ネットワークの二乗誤差の合計を最小化するために、バックプロパゲーションを通じてネットワークの重みとしきい値を継続的に調整することです。

2 BPアルゴリズムの基本的な考え方前回、多層パーセプトロンが隠れ層の重みを取得する方法のボトルネックに遭遇したことを述べました。隠れ層の重みを直接取得することはできないので、最初に出力結果と出力層を介して期待される出力との間の誤差を取得して、隠れ層の重みを間接的に調整できますか?BPアルゴリズムは、そのような考え方で設計されたアルゴリズムであり、学習プロセスは、信号の順方向伝搬とエラーの逆方向伝搬の2つのプロセスで構成されているというのが基本的な考え方です。順方向伝搬中に、入力サンプルは入力レイヤーから渡され、各非表示レイヤーでレイヤーごとに処理されてから、出力レイヤーに送信されます。出力層の実際の出力が期待される出力(教師信号)と一致しない場合、エラーのバックプロパゲーション段階になります。バックプロパゲーション中、出力は何らかの形で隠れ層を介して層ごとに入力層に返送され、各層ユニットのエラー信号とこのエラーを取得するために、エラーは各層のすべてのユニットに割り当てられます。信号は補正単位として使用されます。重量の基準。これら2つのプロセスの具体的なプロセスについては、後で紹介します。

BPアルゴリズムのシグナルフロー図を次の図に示しますここに画像の説明を挿入。3BPネットワーク特性分析-BP3つの要素ANNを分析する場合、通常、1)ネットワークトポロジ、2)伝達関数、3)学習の3つの要素から開始します。アルゴリズム。ここに画像の説明を挿入

各要素の特性を合計して、このANNの機能特性を決定します。そこで、これら3つの要素からBPネットワークの研究も始めます。3.1 BPネットワークのトポロジーは前回述べましたが、BPネットワークは実際には多層パーセプトロンであるため、そのトポロジーは多層パーセプトロンと同じです。単層(3層)パーセプトロンはすでに単純な非線形問題を解決できるため、最も一般的に使用されています。次の図に、3層パーセプトロンのトポロジーを示します。最も単純な3層BPの1つ:ここに画像の説明を挿入3.2 BPネットワークの伝達関数BPネットワークで採用されている伝達関数は、非線形変換関数であるシグモイド関数(S関数とも呼ばれます)です。その特徴は、関数自体とその導関数が連続的であるため、処理が非常に便利であるということです。なぜこの関数を選択するのか、BPネットワークの学習アルゴリズムを紹介するときにさらに紹介します。単極シグモイド関数曲線を次の図に示します。ここに画像の説明を挿入バイポーラシグモイド関数曲線を次の図に示します。ここに画像の説明を挿入3.3 BPネットワークの学習アルゴリズムBPネットワークの学習アルゴリズムはBPアルゴリズムであり、デルタアルゴリズムとも呼ばれます(ANNの学習プロセス中に複数の名前を持つ多くの用語が見つかります)。ネットワーク出力期待される出力と等しくない場合、ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入次。BPネットワークの学習とトレーニングの特定のプロセスを紹介します。

4 BPネットワークトレーニングの分解BPニューラルネットワークのトレーニングは、実際にはネットワークの重みとバイアスの2つのパラメーターを調整することです。BPニューラルネットワークのトレーニングプロセスは、次の2つの部分に分かれています。

出力値をレイヤーごとに波状に送信するフォワード送信、ウェイトを調整し、レイヤーごとに逆方向にバイアスをかけるリバースフィードバック、最初にフォワード送信を見てみましょう。フォワード送信(フィードフォワード)ネットワークをトレーニングする前に、重みとバイアスをランダムに初期化する必要があります。重みごとに[− 1、1] [-1,1] [-1,1]のいずれかを取ります。乱数、各オフセットは、[0、1] [0,1] [0,1]の乱数を取り、順方向送信を開始します。

ニューラルネットワークのトレーニングは、複数の反復によって完了します。各反復はトレーニングセット内のすべてのレコードを使用し、各トレーニングネットワークは1つのレコードのみを使用します。要約の説明は次のとおりです。

while 终止条件未满足:
    for record:dataset:
        trainModel(record)

复制代码

ここに画像の説明を挿入 ここに画像の説明を挿入 4.1 逆向反馈(Backpropagation) ここに画像の説明を挿入 ここに画像の説明を挿入 4.2 训练终止条件 每一轮训练都使用数据集的所有记录,但什么时候停止,停止条件有下面两种: 设置最大迭代次数,比如使用数据集迭代100次后停止训练 计算训练集在网络上的预测准确率,达到一定门限值后停止训练

5 BP网络运行的具体流程 5.1 网络结构 输入层有n nn个神经元,隐含层有p pp个神经元,输出层有q qq个神经元。 5.2 变量定义 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 第九步:判断模型合理性 判断网络误差是否满足要求。 当误差达到预设精度或者学习次数大于设计的最大次数,则结束算法。 否则,选取下一个学习样本以及对应的输出期望,返回第三部,进入下一轮学习。

6 BP网络的设计 在进行BP网络的设计是,一般应从网络的层数、每层中的神经元个数和激活函数、初始值以及学习速率等几个方面来进行考虑,下面是一些选取的原则。 6.1 网络的层数 理论已经证明,具有偏差和至少一个S型隐层加上一个线性输出层的网络,能够逼近任何有理函数,增加层数可以进一步降低误差,提高精度,但同时也是网络 复杂化。另外不能用仅具有非线性激活函数的单层网络来解决问题,因为能用单层网络解决的问题,用自适应线性网络也一定能解决,而且自适应线性网络的 运算速度更快,而对于只能用非线性函数解决的问题,单层精度又不够高,也只有增加层数才能达到期望的结果。 6.2 隐层神经元的个数 网络训练精度的提高,可以通过采用一个隐含层,而增加其神经元个数的方法来获得,这在结构实现上要比增加网络层数简单得多。一般而言,我们用精度和 训练网络的时间来恒量一个神经网络设计的好坏: (1)神经元数太少时,网络不能很好的学习,训练迭代的次数也比较多,训练精度也不高。 (2)神经元数太多时,网络的功能越强大,精确度也更高,训练迭代的次数也大,可能会出现过拟合(over fitting)现象。 由此,我们得到神经网络隐层神经元个数的选取原则是:在能够解决问题的前提下,再加上一两个神经元,以加快误差下降速度即可。

6.3 初始权值的选取 一般初始权值是取值在(−1,1)之间的随机数。另外威得罗等人在分析了两层网络是如何对一个函数进行训练后,提出选择初始权值量级为s√r的策略, 其中r为输入个数,s为第一层神经元个数。

6.4 学习速率 学习速率一般选取为0.01−0.8,大的学习速率可能导致系统的不稳定,但小的学习速率导致收敛太慢,需要较长的训练时间。对于较复杂的网络, 在误差曲面的不同位置可能需要不同的学习速率,为了减少寻找学习速率的训练次数及时间,比较合适的方法是采用变化的自适应学习速率,使网络在 不同的阶段设置不同大小的学习速率。

6.5予想されるエラーの選択ネットワークを設計するプロセスでは、予想されるエラー値も、必要な隠れ層ノードの数に関連して決定される適切な値を比較およびトレーニングすることによって決定する必要があります。一般に、予想されるエラー値が異なる2つのネットワークを同時にトレーニングでき、最後に1つのネットワークが要素を組み合わせて決定されます。

7 BPネットワークの制限BPネットワークには、次の問題があります。

(1)長いトレーニング時間が必要:これは主に学習率が小さすぎることが原因であり、可変または適応学習率を使用することで改善できます。(2)トレーニングがまったくない:これは主にネットワークの麻痺に現れます。通常、この状況を回避するために、初期の重みを小さくして学習率を低くすることを選択します。(3)極小値:ここで使用される最急降下法は極小値に収束する可能性があり、多層ネットワークまたはより多くのニューロンを使用してより良い結果を得ることができます。

8 BPネットワークの改善Pアルゴリズムを改善する主な目的は、トレーニング速度を高速化し、極小値に陥らないようにすることです。一般的な改善方法には、運動量因子アルゴリズム、適応学習率、学習率の変更、および関数関数のポストリダクション法があります。 、など。運動量係数法の基本的な考え方は、バックプロパゲーションに基づいて各体重変化に前の体重変化に比例する値を追加し、バックプロパゲーション法に従って新しい体重変化を生成することです。適応学習率法は、いくつかの特定の問題を対象としています。学習率を変更する方法の原理は、目的関数の重みの逆数の符号が複数の連続した反復で同じである場合、重みの学習率が増加し、符号が反対の場合、学習率が低下します。アクション関数の撤回の法則は、アクション関数を変換すること、つまり定数を追加することです。

第二に、ソースコード

function varargout = findimg(varargin)
% FINDIMG MATLAB code for findimg.fig
%      FINDIMG, by itself, creates a new FINDIMG or raises the existing
%      singleton*.
%
%      H = FINDIMG returns the handle to a new FINDIMG or the handle to
%      the existing singleton*.
%
%      FINDIMG('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in FINDIMG.M with the given input arguments.
%
%      FINDIMG('Property','Value',...) creates a new FINDIMG or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before findimg_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to findimg_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 findimg

% Last Modified by GUIDE v2.5 23-Apr-2021 16:06:05

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @findimg_OpeningFcn, ...
                   'gui_OutputFcn',  @findimg_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 findimg is made visible.
function findimg_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 findimg (see VARARGIN)

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

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes findimg wait for user response (see UIRESUME)
% uiwait(handles.figure1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%定义全局变量
global ButtonDown pos1;
ButtonDown = [];
pos1 = [];
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% --- Outputs from this function are returned to the command line.
function varargout = findimg_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;
axis([0 250 0 250]);

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

% Hint: place code in OpeningFcn to populate axes1
%取消显示axes的坐标轴
set((hObject),'xTick',[]);
set((hObject),'yTick',[]);

% --- Executes on button press in pushbutton1.
function pushbutton1_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
[f,p]=uiputfile({'*.jpg'},'保存文件');  %保存所画的图
str=strcat(p,f);
pix=getframe(handles.axes1);
imwrite(pix.cdata,str,'jpg')


% --- Executes on button press in pushbutton2.
function pushbutton2_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton2 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
cla(handles.axes1);   %清楚axes中所画的图像

% --- Executes on button press in pushbutton3.
function pushbutton3_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton3 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
pix=getframe(handles.axes1);
imwrite(pix.cdata,'imgtest.jpg');
newimage = imread('imgtest.jpg');           %保存新画的数字

newimgResult = identify(newimage) ;                  %通过识别函数进行比较
Result = BpRecognize(newimgResult);
msgbox(num2str(Result),'识别结果','help');



% --- Executes on button press in pushbutton4.
function pushbutton4_Callback(hObject, eventdata, handles)
% hObject    handle to pushbutton4 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
BpTrain();
msgbox('Finish Train','提示','modal');




% --- Executes on mouse press over figure background, over a disabled or
% --- inactive control, or over an axes background.
function figure1_WindowButtonDownFcn(hObject, eventdata, handles)
% hObject    handle to figure1 (see GCBO)
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
%鼠标按下事件
global ButtonDown pos1;  
if(strcmp(get(gcf,'SelectionType'),'normal'))%判断鼠标按下的类型,normal为左键  
    ButtonDown=1;  
    pos1=get(handles.axes1,'CurrentPoint');%获取坐标轴上鼠标的位置  
end  
function [] = BpTrain()
%UNTITLED5 Summary of this function goes here
%   Detailed explanation goes here

clear all;
clc

ctime = datestr(now, 30);%取系统时间
tseed = str2num(ctime((end - 5) : end)) ;%将时间字符转换为数字
rand('seed', tseed) ;%设置种子,若不设置种子则可取到伪随机数

load Data2;  %数据有10类数据,每类2025列,有4列是标签。共200*29 
c = 0;
data = [];
for i = 1:10
    for j = 1:20
        c = c + 1;
        data(c,:) = pattern(i).feature(j,:);
    end
end
 
%=============训练数据=============
Data = data(1:20, 1:25);
Data = [ Data ; data(21:40, 1:25)];
Data = [ Data ; data(41:60, 1:25)];   
Data = [ Data ; data(61:80, 1:25)];
Data = [ Data ; data(81:100, 1:25)];
Data = [ Data ; data(101:120, 1:25)];
Data = [ Data ; data(121:140, 1:25)];
Data = [ Data ; data(141:160, 1:25)];
Data = [ Data ; data(161:180, 1:25)];
Data = [ Data ; data(181:200, 1:25)];

%0标签
Data(1:20, 26)   = 0;
Data(1:20, 27)   = 0;
Data(1:20, 28)   = 0;
Data(1:20, 29)   = 0;
%1标签
Data(21:40, 26)   = 0;
Data(21:40, 27)   = 0;
Data(21:40, 28)   = 0;
Data(21:40, 29)   = 1;

Data(41:60, 26)   = 0;
Data(41:60, 27)   = 0;
Data(41:60, 28)   = 1;
Data(41:60, 29)   = 0;

Data(61:80, 26)   = 0;
Data(61:80, 27)   = 0;
Data(61:80, 28)   = 1;
Data(61:80, 29)   = 1;

Data(81:100, 26)   = 0;
Data(81:100, 27)   = 1;
Data(81:100, 28)   = 0;
Data(81:100, 29)   = 0;

Data(101:120, 26)   = 0;
Data(101:120, 27)   = 1;
Data(101:120, 28)   = 0;
Data(101:120, 29)   = 1;

Data(121:140, 26)   = 0;
Data(121:140, 27)   = 1;
Data(121:140, 28)   = 1;
Data(121:140, 29)   = 0;

Data(141:160, 26)   = 0;
Data(141:160, 27)   = 1;
Data(141:160, 28)   = 1;
Data(141:160, 29)   = 1;

Data(161:180, 26)   = 1;
Data(161:180, 27)   = 0;
Data(161:180, 28)   = 0;
Data(161:180, 29)   = 0;

Data(181:200, 26)   = 1;
Data(181:200, 27)   = 0;
Data(181:200, 28)   = 0;
Data(181:200, 29)   = 1;

DN = size(Data, 1);

%输入层结点数
S1N = 25;

%第二层结点数
S2N = 50;

%输出层结点数
S3N = 4;

%学习率
sk = 0.5;


%随机初始化各层的W和B
W2 = -1 + 2 .* rand(S2N, S1N);
B2 = -1 + 2 .* rand(S2N, 1);

W3 = -1 + 2 .* rand(S3N, S2N);
B3 = -1 + 2 .* rand(S3N, 1);

%数据样本下标
di = 1; 


for i=1:50000
    
    
    %第三层输出
    n3 = W3 * a2 + B3;
    a3 = Logsig(n3);   %第三层传输函数为logsig
    
    %计算输出层误差
    e  = t - a3;
    err = (e') * e;
    
    Fd3 = diag((1 - a3) .* a3);
    S3 = -2 * Fd3 * e;
    
    Fd2 = diag((1 - a2) .* a2);
    S2 = Fd2 * (W3') * S3;
    
    W3 = W3 - sk*S3*(a2'); %梯度下降步长
    B3 = B3 - sk*S3;
    
    W2 = W2 - sk*S2*(a1');
    B2 = B2 - sk*S2;
end
msgbox(num2str(err),'输出层误差','help');
save('W2.mat','W2');
save('W3.mat','W3');
save('B2.mat','B2');
save('B3.mat','B3');


end



复制代码

3.運用結果

ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入 ここに画像の説明を挿入

4.備考

バージョン:2014a

おすすめ

転載: juejin.im/post/6982760463134113828
おすすめ