基于神经网络实现手写数字识别(matlab)
- 實驗目的
在matlab平臺上,采用神經網絡實現手寫數字識別。在實驗過程中:
1、初步探討數據集預處理的作用。
2、增加對神經網絡的理解,探討隱含層層數,節點數和訓練步長對識別成功率的影響,找到較佳的參數。
3、應用交叉驗證法評估訓練模型的優劣,建立多次實驗取均值的嚴謹思維。
二、分類器原理闡述
??1、前向傳播:
輸入樣本從輸入層傳入,經隱層逐層處理后,傳到輸出層,計算實際輸出和期望輸出的誤差。
??2、誤差反向傳播:
運用鏈式法則,采用誤差梯度下降法對權值進行修正。
- 實驗方法
? ? ? 通過重復取單位矩陣不同列巧妙地構造出訓練和測試標簽。
- 實驗結果
1、初步探討數據集預處理對實驗結果的影響:
(1)處理前和處理后的數字樣本圖片:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ? ? ? ? ? 處理前? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 處理后
可以看到,處理后圖片去掉了許多不必要的空白部分,增加了有用像素點比例。
(3)處理前后訓練正確率比較:
? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? ? ? ? ?處理后? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?處理前
? 由上可知:在網絡結構相同的情況下對圖片處理前后正確率天差地別,在我看來,這或許是因為這些圖像只有兩種取值,一個是0,另一個是255。值255對網絡中的權值影響比0大許多,如果沒有將大量空白區域通過預處理刪去,那么有效信息(即0)對網絡權值的影響將更少,這會極大的影響網絡的訓練。
2、探討隱含層節點數對識別成功率的影響:
| 隱含層層數 | 隱含層節點數 | 訓練步長 | 識別成功率 |
| ???1 | (20) | ??0.1 | ??0.7455 |
| ???1 | ??(25) | ??0.1 | ??0.8 |
| ???1 | (30) | ??0.1 | 0.8455 |
| ???1 | ??(35) | ??0.1 | 0.8182 |
| ???1 | ??(40) | ??0.1 | ??0.7 |
| ???1 | ??(45) | ??0.1 | ??0.8273 |
| ???1 | ??(50) | ??0.1 | 0.8455 |
| ???1 | ??(55) | ??0.1 | 0.7455 |
| ???1 | ??(60) | ??0.1 | 0.8636 |
| ???1 | ??(65) | ??0.1 | 0.8182 |
| ???1 | ??(70) | ??0.1 | 0.8273 |
| ???1 | ??(80) | ??0.1 | 0.7727 |
將上表數據繪制成曲線圖如下:
? 由上可知:一層隱含層時在節點數為30,50和60時有最優點,三個最優點的識別成功率相差并沒有太大。綜合網絡復雜程度和訓練時間的因素來看,相比于節點數為50和60,節點數為30個為更佳選擇。
3、探討隱含層層數對識別成功率的影響:
| 隱含層層數 | 隱含層節點數 | 訓練步長 | 識別成功率 |
| ???1 | ??(10) | ??0.1 | ???0.4727 |
| ???2 | ?(10 ,10) | ??0.1 | ???0.8364 |
| ???3 | ?(10 ,10 ,10) | ??0.1 | ???0.7727 |
| ???4 | (10,10,10,10) | ??0.1 | ???0.7636 |
| ???5 | (10,10,10,10,10) | ??0.1 | ???0.8182 |
| ???6 | (10,10,10,10,10,10) | ??0.1 | ???0.7727 |
將上表數據繪制成曲線圖如下:
??由上圖可知,當隱含層>=2后識別成功率基本穩定在0.8左右,層數的增加使網絡復雜性大幅增加但識別成功率并沒有得到較大提高,所以,本問題下,隱含層層數選擇2層即可。
4、探討訓練步長對識別成功率的影響:
| 隱含層層數 | 隱含層節點數 | 訓練步長 | 識別成功率 |
| ???2 | ??(30,30) | ??0.1 | ???0.8818 |
| ???2 | ??(30,30) | ??0.2 | ???0.8364 |
| ???2 | ??(30,30) | ??0.3 | ???0.8636 |
| ???2 | ??(30,30) | ??0.05 | ???0.8636 |
| ???2 | ??(30,30) | ??0.02 | ???0.9364 |
| ???2 | (30,30) | ??0.01 | ???0.8636 |
將上表數據繪制成曲線圖如下:
??
? ? 由上可見,當訓練步長取0.02時,有一個最優點達到94%,識別成功率高過其它數據的平均值(86%)約8%。這一幅度可以說明在本次實驗中,訓練步長應該選擇0.02。初步考慮應該是(1)相較于更大的步長,0.02可以更好的尋找到最優點,避免“跨越”最優點。(2)相較于更小的步長,0.02可以避免落入局部最優。
六、結果討論
??1、本實驗充分說明了數據預處理的重要性。通過預處理,可以將大量的無益于分類的特征消除,一方面既減少了神經網絡輸入節點,降低了網絡復雜度,減少了訓練時間;另一方面,同時也提高了有用信息的比例,有利于提高神經網絡的分類效果。
??2、在調整神經網絡的隱含層層數,節點數和訓練步長這幾個參數時,應該從簡單到復雜,以表格的形式羅列。這不僅極大地增加了不同參數效果的可觀性,便于較快的查找到較為適合的參數,同時也是一個正常的學習過程:由欠擬合漸漸可以較好地提取到樣本特征再到過擬合。我們可以從這個過程清楚神經網絡處于什么階段:欠擬合,較好學習還是過擬合。這又方便了我們調參和分析。
??3、本實驗采用了5倍交叉驗證法,這一方法雖然極大的增加了代碼運行時間(大概花費十幾分鐘),但是這體現了實驗的嚴謹性,這一點很重要。
代碼和數據集可以在這里下載:matlab代碼和數據集.zip-機器學習文檔類資源-CSDN下載里面幾個.m文件是相互調用關系,其中my_train是主函數更多下載資源、學習資料請訪問CSDN下載頻道.https://download.csdn.net/download/weixin_46579610/39154915
這里給出代碼:
function [train,test] = read_picture(model,file_address) %讀取一種數字圖片信息,返回訓練集和測試集 picture_num=55;%圖片數量 number=randperm(picture_num);%產生1到55隨機整數,打散樣本 train=[]; test=[]; %將55個樣本分為5份,根據不同情況設置不同測試集和訓練集%最后一組作為測試集 if model==1 for i=1:44%訓練集pic_name=strcat(num2str(number(i)),'.png');x=imread(strcat(file_address,pic_name));%讀取一張圖片x=rgb2gray(x);%灰度化處理x=im2double(x);%轉化為double類型,不轉化會出錯[a b]=find(x~=1);%二值化處理x=x(min(a):max(a),min(b):max(b));%只選取數字所在區域%imshow(x);%畫圖查看是否處理成功x=imresize(x,[12,12]);%壓縮圖片x=reshape(x,144,1);%將矩陣轉化為列向量train=[train x]; end for i=45:55%測試集pic_name=strcat(num2str(number(i)),'.png');y=imread(strcat(file_address,pic_name));y=rgb2gray(y);y=im2double(y);[c d]=find(y~=1);y=y(min(c):max(c),min(d):max(d));%imshow(y);y=imresize(y,[12,12]);y=reshape(y,144,1);test=[test y]; end end%第四組作為測試集 if model==2 for i=1:33pic_name=strcat(num2str(number(i)),'.png');x=imread(strcat(file_address,pic_name));x=rgb2gray(x);x=im2double(x);[a b]=find(x~=1);x=x(min(a):max(a),min(b):max(b));x=imresize(x,[12,12]);x=reshape(x,144,1);train=[train x]; end for i=34:44pic_name=strcat(num2str(number(i)),'.png');y=imread(strcat(file_address,pic_name));y=rgb2gray(y);y=im2double(y);[c d]=find(y~=1);y=y(min(c):max(c),min(d):max(d));y=imresize(y,[12,12]);y=reshape(y,144,1);test=[test y]; end for i=45:55pic_name=strcat(num2str(number(i)),'.png');x=imread(strcat(file_address,pic_name));x=rgb2gray(x);x=im2double(x);[a b]=find(x~=1);x=x(min(a):max(a),min(b):max(b));x=imresize(x,[12,12]);x=reshape(x,144,1);train=[train x]; end end%第三組作為測試集 if model==3 for i=1:22pic_name=strcat(num2str(number(i)),'.png');x=imread(strcat(file_address,pic_name));x=rgb2gray(x);x=im2double(x);[a b]=find(x~=1);x=x(min(a):max(a),min(b):max(b));x=imresize(x,[12,12]);x=reshape(x,144,1);train=[train x]; end for i=23:33pic_name=strcat(num2str(number(i)),'.png');y=imread(strcat(file_address,pic_name));y=rgb2gray(y);y=im2double(y);[c d]=find(y~=1);y=y(min(c):max(c),min(d):max(d));y=imresize(y,[12,12]);y=reshape(y,144,1);test=[test y]; end for i=34:55pic_name=strcat(num2str(number(i)),'.png');x=imread(strcat(file_address,pic_name));x=rgb2gray(x);x=im2double(x);[a b]=find(x~=1);x=x(min(a):max(a),min(b):max(b));x=imresize(x,[12,12]);x=reshape(x,144,1);train=[train x]; end end%第二組作為測試集 if model==4 for i=1:11pic_name=strcat(num2str(number(i)),'.png');x=imread(strcat(file_address,pic_name));x=rgb2gray(x);x=im2double(x);[a b]=find(x~=1);x=x(min(a):max(a),min(b):max(b));x=imresize(x,[12,12]);x=reshape(x,144,1);train=[train x]; end for i=12:22pic_name=strcat(num2str(number(i)),'.png');y=imread(strcat(file_address,pic_name));y=rgb2gray(y);y=im2double(y);[c d]=find(y~=1);y=y(min(c):max(c),min(d):max(d));y=imresize(y,[12,12]);y=reshape(y,144,1);test=[test y]; end for i=23:55pic_name=strcat(num2str(number(i)),'.png');x=imread(strcat(file_address,pic_name));x=rgb2gray(x);x=im2double(x);[a b]=find(x~=1);x=x(min(a):max(a),min(b):max(b));x=imresize(x,[12,12]);x=reshape(x,144,1);train=[train x]; end end%第一組作為測試集 if model==5for i=1:11pic_name=strcat(num2str(number(i)),'.png');y=imread(strcat(file_address,pic_name));y=rgb2gray(y);y=im2double(y);[c d]=find(y~=1);y=y(min(c):max(c),min(d):max(d));y=imresize(y,[12,12]);y=reshape(y,144,1);test=[test y];end for i=12:55pic_name=strcat(num2str(number(i)),'.png');x=imread(strcat(file_address,pic_name));x=rgb2gray(x);x=im2double(x);[a b]=find(x~=1);x=x(min(a):max(a),min(b):max(b));x=imresize(x,[12,12]);x=reshape(x,144,1);train=[train x]; end endendfunction [net] = init_net(input,output)T=[30 30]; net=newff(input,output,T); net.trainParam.goal=0.00001; net.trainParam.lr=0.02; net.trainParam.min_grad = 1e-6; net.trainParam.epochs=100; endfunction [success_rate] = my_train() %存儲數據的文件地址,在運行前要根據自己的數據文件所在地址修改并且設置好路徑 %圖片數據就使用我附帶的文件夾file_address={'D:\Desktop\homework\big_homework\img\sample0\';'D:\Desktop\homework\big_homework\img\sample1\';'D:\Desktop\homework\big_homework\img\sample2\';'D:\Desktop\homework\big_homework\img\sample3\';'D:\Desktop\homework\big_homework\img\sample4\';'D:\Desktop\homework\big_homework\img\sample5\';'D:\Desktop\homework\big_homework\img\sample6\';'D:\Desktop\homework\big_homework\img\sample7\';'D:\Desktop\homework\big_homework\img\sample8\';'D:\Desktop\homework\big_homework\img\sample9\'}; %生成訓練標簽 a=eye(10,10); total_tag=[]; for i=1 :10tag=[];for j=1 :44tag=[tag a(:,i)];endtotal_tag=[total_tag tag]; end %生成測試標簽 test_tag=[]; for i=1 :10tag=[];for j=1 :11tag=[tag i];endtest_tag=[test_tag tag]; end %5倍交叉驗證 total_error_rate=0; for i=1:3%重復3次 error=0; for model= 1:5%隨機劃分5等份model=1;%讀取數據 total_train=[]; total_test=[];for i=1: 10[one_train,one_test] = read_picture(model,file_address{i});total_train=[total_train one_train];total_test=[total_test one_test];end%初始化網絡 net = init_net(total_train,total_tag); %訓練網絡 net=train(net,total_train,total_tag); %測試網絡 test_output=sim(net,total_test); label_train=[]; %將測試集的到的輸出轉化為元素是0或1的向量 for i=1:110label_one=find(test_output(:,i)==max(test_output(:,i)));label_train=[label_train label_one]; enderror_matrix=test_tag-label_train; error_num=sum(any(error_matrix,1));%統計非零列的個數,即分類錯誤個數error=error+error_num; end error_rate= error/550;%統計一次交叉驗證的錯誤率 total_error_rate=total_error_rate+error_rate; end total_error_rate=total_error_rate/3; success_rate=1-total_error_rate;%計算正確率end總結
以上是生活随笔為你收集整理的基于神经网络实现手写数字识别(matlab)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专升本资料怎么找?可以通过哪些渠道找到?
- 下一篇: 日知其所无