神經網絡用於手寫數字識別


一:人工神經網絡

     人類之所以能夠思考,學習,判斷,大部分都要歸功於人腦中復雜的神經網絡。雖然現在人腦的機理還沒有完全破譯,但是人腦中神經元之間的連接,信息的傳遞都已為人所知曉。於是人們就想能否模擬人腦的功能用於解決其他問題,這就發展出人工神經網絡。

      人工神經網絡(artificial neural network,縮寫ANN),是一種模仿生物神經網絡的結構和功能的數學模型或計算模型。神經網絡由大量的人工神經元聯結進行計算。大多數情況下人工神經網絡能在外界信息的基礎上改變內部結構,是一種自適應系統。現代神經網絡是一種非線性統計性數據建模工具,常用來對輸入和輸出間復雜的關系進行建模,或用來探索數據的模式。

      神經網絡是一種運算模型,由大量的節點(或稱“神經元”,或“單元”)和之間相互聯接構成。每個節點代表一種特定的輸出函數,稱為激勵函數(activation function)。每兩個節點間的連接都代表一個對於通過該連接信號的加權值,稱之為權重(weight),這相當於人工神經網絡的記憶。網絡的輸出則依網絡的連接方式,權重值和激勵函數的不同而不同。而網絡自身通常都是對自然界某種算法或者函數的逼近,也可能是對一種邏輯策略的表達。

1.1 神經元

      人工神經網絡是由成千上萬個神經元構成的,所以我們要先學習了解神經元。

神經元示意圖:

Ncell.png

  • a1~an為輸入向量的各個分量
  • w1~wn為神經元各個突觸的權值
  • b為偏置
  • f為傳遞函數,通常為非線性函數。一般有traingd(),tansig(),hardlim()。以下默認為hardlim()
  • t為神經元輸出

      數學表示 t = f(\vec{W}\vec{A'}+b)

  • \vec{W}為權向量
  • \vec{A}為輸入向量,\vec{A'}\vec{A}的轉置
  • b為偏置
  • f為傳遞函數

      可見,一個神經元的功能是求得輸入向量與權向量的內積后,經一個非線性傳遞函數得到一個標量結果。單個神經元的作用:把一個n維向量空間用一個超平面分割成兩部分(稱之為判斷邊界),給定一個輸入向量,神經元可以判斷出這個向量位於超平面的哪一邊。

該超平面的方程:\vec{W}\vec{p}+b=0

  • \vec{W}權向量
  • b偏置
  • \vec{p}超平面上的向量

1.2 bp神經網絡結構

神經網絡是由很多神經元組成,可以分為輸入,輸出,隱含層。

image

bp神經網絡的特點:信號前向傳遞,誤差反向傳播。若輸出存在誤差,根據誤差調整權值和閾值,使網絡的輸出接近預期。

二:手寫字符識別

數據集介紹:

    數據集包含0-9這10個數字的手寫體。是放在10個文件夾里,文件夾的名稱對應存放的手寫數字圖片的數字,每個數字500張,每張圖片的像素統一為28*28。

samples:

0_1 1_1 2_1 3_1 4_1 5_1 6_1 7_1 8_1 9_1

識別流程:

blog_10_28

    流程如圖,首先要對數據進行處理,這個主要是批量讀取圖片和特征提取的過程,特征提取的方法很多,這里只挑選最簡單的來實現,然后是訓練出一個神經網絡的模型,最后用測試數據進行測試。為了方面,這里的神經網絡的創建,訓練和測試采用matlab函數來實現。

2.0 主函數:

clc;
clear all;
close all;
%% 讀取圖像
root='./data';
img=read_train(root);
%% 提取特征
img_feature=feature_lattice(img);
%% 構造標簽
class=10;
numberpclass=500;
ann_label=zeros(class,numberpclass*class);
ann_data=img_feature;
for i=1:class
 for j=numberpclass*(i-1)+1:numberpclass*i
     ann_label(i,j)=1;
 end
end

%% 選定訓練集和測試集
k=rand(1,numberpclass*class);  
[m,n]=sort(k);  
ntraindata=4500;
ntestdata=500;
train_data=ann_data(:,n(1:ntraindata));
test_data=ann_data(:,n(ntraindata+1:numberpclass*class));
train_label=ann_label(:,n(1:ntraindata));
test_label=ann_label(:,n(ntraindata+1:numberpclass*class));
%% BP神經網絡創建,訓練和測試
net=network_train(train_data,train_label);
predict_label=network_test(test_data,net);
%% 正確率計算
[u,v]=find(test_label==1);
label=u';
error=label-predict_label;
accuracy=size(find(error==0),2)/size(label,2)

2.1 批量讀取圖片函數

文件存放特點:在data下有10個子文件夾,每個子文件夾下有500張圖片。函數可以利用於任何批量圖片的讀取,傳入的是文件夾路徑,輸出的是一個n(對應圖片數目)維cell,每個cell存放的是圖片的數據。

function [imglist] = read_train(root)
%========讀取文件夾========%
out_Files = dir(root);%展開
tempind=0;
imglist=cell(0);
n=length(out_Files);
%========讀取文件========%
for i = 1:n;
    if strcmp(out_Files(i).name,'.')|| strcmp(out_Files(i).name,'..')
    else
        rootpath=strcat(root,'/',out_Files(i).name);
        in_filelist=dir(rootpath);
        ni=length(in_filelist);
        for j=1:ni
            if strcmp(in_filelist(j).name,'.')|| strcmp(in_filelist(j).name,'..')|| strcmp(in_filelist(j).name,'Desktop_1.ini')|| strcmp(in_filelist(j).name,'Desktop_2.ini')
            else
                tempind=tempind+1;
                imglist{tempind}=imread(strcat(rootpath,'/',in_filelist(j).name));
            end
        end
    end
end
end

 

2.2 特征提取

提取所有圖像的特征,二值化—resize-提取特征

function feature = feature_lattice(img)
% 輸入:黑底白字的二值圖像。輸出:35維的網格特征
% ======提取特征,轉成5*7的特征矢量,把圖像中每10*10的點進行划分相加,進行相加成一個點=====%
%======即統計每個小區域中圖像象素所占百分比作為特征數據====%
for i=1:length(img);
bw2=im2bw(img{i},graythresh(img{i}));
bw_7050=imresize(bw2,[70,50]);
for cnt=1:7
    for cnt2=1:5
        Atemp=sum(bw_7050(((cnt*10-9):(cnt*10)),((cnt2*10-9):(cnt2*10))));%10*10box
        lett((cnt-1)*5+cnt2)=sum(Atemp);
    end
end
lett=((100-lett)/100);
lett=lett';
feature(:,i)=lett;
end

2.3 構造標簽

要構造出適合神經網絡的標簽,在這個例子中有10個類,若為某個標簽,那么這個位置的值為1,其余為0。

image

2.4 BP神經網絡創建,訓練和測試

主要是幾個參數的設置,layer隱含層的神經元個數。trainFcn:訓練算法

function net = network_train(train_data,train_label )
% 輸入:訓練圖像特征和label。輸出:訓練好的神經網絡

% BP網絡訓練
% 初始化網絡結構
layer=25;
net=newff(train_data,train_label,layer);
net.trainParam.epochs=1;
net.trainParam.lr=0.1;
net.trainParam.goal=0.001;
net.trainFcn='trainrp';
% 網絡訓練
net=train(net,train_data,train_label);
end

 

function out = network_test(test_data,net)
%% BP網絡預測

an=sim(net,test_data);
for i=1:length(test_data)
    out(i)=find(an(:,i)==max(an(:,i)));
end

end

 

2.5 數據集及完整代碼下載

http://pan.baidu.com/s/1pJz97pp

參考資料:

【1】http://zh.wikipedia.org/zh-cn/%E4%BA%BA%E5%B7%A5%E7%A5%9E%E7%BB%8F%E7%BD%91%E7%BB%9C


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM