一:人工神經網絡
人類之所以能夠思考,學習,判斷,大部分都要歸功於人腦中復雜的神經網絡。雖然現在人腦的機理還沒有完全破譯,但是人腦中神經元之間的連接,信息的傳遞都已為人所知曉。於是人們就想能否模擬人腦的功能用於解決其他問題,這就發展出人工神經網絡。
人工神經網絡(artificial neural network,縮寫ANN),是一種模仿生物神經網絡的結構和功能的數學模型或計算模型。神經網絡由大量的人工神經元聯結進行計算。大多數情況下人工神經網絡能在外界信息的基礎上改變內部結構,是一種自適應系統。現代神經網絡是一種非線性統計性數據建模工具,常用來對輸入和輸出間復雜的關系進行建模,或用來探索數據的模式。
神經網絡是一種運算模型,由大量的節點(或稱“神經元”,或“單元”)和之間相互聯接構成。每個節點代表一種特定的輸出函數,稱為激勵函數(activation function)。每兩個節點間的連接都代表一個對於通過該連接信號的加權值,稱之為權重(weight),這相當於人工神經網絡的記憶。網絡的輸出則依網絡的連接方式,權重值和激勵函數的不同而不同。而網絡自身通常都是對自然界某種算法或者函數的逼近,也可能是對一種邏輯策略的表達。
1.1 神經元
人工神經網絡是由成千上萬個神經元構成的,所以我們要先學習了解神經元。
神經元示意圖:
- a1~an為輸入向量的各個分量
- w1~wn為神經元各個突觸的權值
- b為偏置
- f為傳遞函數,通常為非線性函數。一般有traingd(),tansig(),hardlim()。以下默認為hardlim()
- t為神經元輸出
數學表示
為權向量
為輸入向量,
為
的轉置
為偏置
為傳遞函數
可見,一個神經元的功能是求得輸入向量與權向量的內積后,經一個非線性傳遞函數得到一個標量結果。單個神經元的作用:把一個n維向量空間用一個超平面分割成兩部分(稱之為判斷邊界),給定一個輸入向量,神經元可以判斷出這個向量位於超平面的哪一邊。
該超平面的方程:
權向量
偏置
超平面上的向量
1.2 bp神經網絡結構
神經網絡是由很多神經元組成,可以分為輸入,輸出,隱含層。
bp神經網絡的特點:信號前向傳遞,誤差反向傳播。若輸出存在誤差,根據誤差調整權值和閾值,使網絡的輸出接近預期。
二:手寫字符識別
數據集介紹:
數據集包含0-9這10個數字的手寫體。是放在10個文件夾里,文件夾的名稱對應存放的手寫數字圖片的數字,每個數字500張,每張圖片的像素統一為28*28。
samples:
識別流程:
流程如圖,首先要對數據進行處理,這個主要是批量讀取圖片和特征提取的過程,特征提取的方法很多,這里只挑選最簡單的來實現,然后是訓練出一個神經網絡的模型,最后用測試數據進行測試。為了方面,這里的神經網絡的創建,訓練和測試采用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。
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