天天看點

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

一、簡介

1 概述\ BP(Back Propagation)神經網絡是1986年由Rumelhart和McCelland為首的科研小組提出,參見他們發表在Nature上的論文 Learning representations by back-propagating errors 。

BP神經網絡是一種按誤差逆傳播算法訓練的多層前饋網絡,是目前應用最廣泛的神經網絡模型之一。BP網絡能學習和存貯大量的 輸入-輸出模式映射關系,而無需事前揭示描述這種映射關系的數學方程。它的學習規則是使用最速下降法,通過反向傳播來不斷 調整網絡的權值和門檻值,使網絡的誤差平方和最小。

2 BP算法的基本思想\ 上一次我們說到,多層感覺器在如何擷取隐層的權值的問題上遇到了瓶頸。既然我們無法直接得到隐層的權值,能否先通過輸出層得到輸出結果和期望輸出的誤差來間接調整隐層的權值呢?BP算法就是采用這樣的思想設計出來的算法,它的基本思想是,學習過程由信号的正向傳播與誤差的反向傳播兩個過程組成。\ 正向傳播時,輸入樣本從輸入層傳入,經各隐層逐層處理後,傳向輸出層。若輸出層的實際輸出與期望的輸出(教師信号)不符,則轉入誤差的反向傳播階段。\ 反向傳播時,将輸出以某種形式通過隐層向輸入層逐層反傳,并将誤差分攤給各層的所有單元,進而獲得各層單元的誤差信号,此誤差信号即作為修正各單元權值的依據。\ 這兩個過程的具體流程會在後文介紹。

BP算法的信号流向圖如下圖所示\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\ 3 BP網絡特性分析——BP三要素\ 我們分析一個ANN時,通常都是從它的三要素入手,即\ 1)網絡拓撲結構;\ 2)傳遞函數;\ 3)學習算法。\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

每一個要素的特性加起來就決定了這個ANN的功能特性。是以,我們也從這三要素入手對BP網絡的研究。\ 3.1 BP網絡的拓撲結構\ 上一次已經說了,BP網絡實際上就是多層感覺器,是以它的拓撲結構和多層感覺器的拓撲結構相同。由于單隐層(三層)感覺器已經能夠解決簡單的非線性問題,是以應用最為普遍。三層感覺器的拓撲結構如下圖所示。\ 一個最簡單的三層BP:\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\ 3.2 BP網絡的傳遞函數\ BP網絡采用的傳遞函數是非線性變換函數——Sigmoid函數(又稱S函數)。其特點是函數本身及其導數都是連續的,因而在處理上十分友善。為什麼要選擇這個函數,等下在介紹BP網絡的學習算法的時候會進行進一步的介紹。\ 單極性S型函數曲線如下圖所示。\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\ 雙極性S型函數曲線如下圖所示。\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\ 3.3 BP網絡的學習算法\ BP網絡的學習算法就是BP算法,又叫 δ 算法(在ANN的學習過程中我們會發現不少具有多個名稱的術語), 以三層感覺器為例,當網絡輸出與期望輸出不等時,存在輸出誤差 E ,定義如下\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\ 下面我們會介紹BP網絡的學習訓練的具體過程。

4 BP網絡的訓練分解\ 訓練一個BP神經網絡,實際上就是調整網絡的權重和偏置這兩個參數,BP神經網絡的訓練過程分兩部分:

前向傳輸,逐層波浪式的傳遞輸出值;\ 逆向回報,反向逐層調整權重和偏置;\ 我們先來看前向傳輸。\ 前向傳輸(Feed-Forward前向回報)\ 在訓練網絡之前,我們需要随機初始化權重和偏置,對每一個權重取[ − 1 , 1 ] [-1,1][−1,1]的一個随機實數,每一個偏置取[ 0 , 1 ] [0,1][0,1]的一個随機實數,之後就開始進行前向傳輸。

神經網絡的訓練是由多趟疊代完成的,每一趟疊代都使用訓練集的所有記錄,而每一次訓練網絡隻使用一條記錄,抽象的描述如下:

while 終止條件未滿足: for record:dataset: trainModel(record)

  • 1
  • 2
  • 3
  • 4
【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\ 4.1 逆向回報(Backpropagation)\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\ 4.2 訓練終止條件\ 每一輪訓練都使用資料集的所有記錄,但什麼時候停止,停止條件有下面兩種:\ 設定最大疊代次數,比如使用資料集疊代100次後停止訓練\ 計算訓練集在網絡上的預測準确率,達到一定門限值後停止訓練

5 BP網絡運作的具體流程\ 5.1 網絡結構\ 輸入層有n nn個神經元,隐含層有p pp個神經元,輸出層有q qq個神經元。\ 5.2 變量定義\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\ 第九步:判斷模型合理性\ 判斷網絡誤差是否滿足要求。\ 當誤差達到預設精度或者學習次數大于設計的最大次數,則結束算法。\ 否則,選取下一個學習樣本以及對應的輸出期望,傳回第三部,進入下一輪學習。

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 期望誤差的選取\ 在設計網絡的過程中,期望誤內插補點也應當通過對比訓練後确定一個合适的值,這個合适的值是相對于所需要的隐層節點數來确定的。一般情況下,可以同時對兩個不同 的期望誤內插補點的網絡進行訓練,最後通過綜合因素來确定其中一個網絡。

7 BP網絡的局限性\ BP網絡具有以下的幾個問題:

(1)需要較長的訓練時間:這主要是由于學習速率太小所造成的,可采用變化的或自适應的學習速率來加以改進。\ (2)完全不能訓練:這主要表現在網絡的麻痹上,通常為了避免這種情況的産生,一是選取較小的初始權值,而是采用較小的學習速率。\ (3)局部最小值:這裡采用的梯度下降法可能收斂到局部最小值,采用多層網絡或較多的神經元,有可能得到更好的結果。

8 BP網絡的改進\ P算法改進的主要目标是加快訓練速度,避免陷入局部極小值等,常見的改進方法有帶動量因子算法、自适應學習速率、變化的學習速率以及作用函數後縮法等。 動量因子法的基本思想是在反向傳播的基礎上,在每一個權值的變化上加上一項正比于前次權值變化的值,并根據反向傳播法來産生新的權值變化。而自适應學習 速率的方法則是針對一些特定的問題的。改變學習速率的方法的原則是,若連續幾次疊代中,若目标函數對某個權倒數的符号相同,則這個權的學習速率增加, 反之若符号相反則減小它的學習速率。而作用函數後縮法則是将作用函數進行平移,即加上一個常數。

二、源代碼

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

% Last Modified by GUIDE v2.5 06-Apr-2020 18:32:38

% Begin initialization code - DO NOT EDIT guiSingleton = 1; guiState = struct('guiName', mfilename, ... 'guiSingleton', guiSingleton, ... 'guiOpeningFcn', @numberreconginizeOpeningFcn, ... 'guiOutputFcn', @numberreconginizeOutputFcn, ... 'guiLayoutFcn', [] , ... 'guiCallback', []); if nargin && ischar(varargin{1}) guiState.gui_Callback = str2func(varargin{1}); end

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

% --- Executes just before numberreconginize is made visible. function numberreconginizeOpeningFcn(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 numberreconginize (see VARARGIN)

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

% Update handles structure guidata(hObject, handles);

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

% --- Outputs from this function are returned to the command line. function varargout = numberreconginizeOutputFcn(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;

% --- Executes on button press in openimage. function openimageCallback(hObject, eventdata, handles) % hObject handle to openimage (see GCBO) % eventdata reserved - to be defined in a future version of MATLAB % handles structure with handles and user data (see GUIDATA) [filename,pathname]=uigetfile({'.png';'.bmp';'.tif';'.jpg';'.'},'載入圖像'); if isequal(filename,0)|isequal(pathname,0) errordlg('沒有選中檔案','出錯'); return; else file=[pathname,filename]; global S %設定一個全局變量S,儲存初始圖像路徑,以便之後的還原操作 S=file; x=imread(file); set(handles.axes1,'HandleVisibility','ON'); axes(handles.axes1); function edit1_Callback(hObject, eventdata, handles) % hObject handle to edit1 (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 edit1 as text % str2double(get(hObject,'String')) returns contents of edit1 as a double

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

三、運作結果

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI
【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

\

【手寫數字識别】基于BP神經網絡手寫數字識别matlab源碼含GUI

四、備注

版本:2014a

繼續閱讀