日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > 循环神经网络 >内容正文

循环神经网络

基于神经网络实现手写数字识别(matlab)

發布時間:2024/5/14 循环神经网络 83 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于神经网络实现手写数字识别(matlab) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  • 實驗目的

matlab平臺上,采用神經網絡實現手寫數字識別。在實驗過程中:

1、初步探討數據集預處理的作用

2、增加對神經網絡的理解,探討隱含層層數,節點數和訓練步長對識別成功率的影響,找到較佳的參數。

3、應用交叉驗證法評估訓練模型的優劣,建立多次實驗取均值的嚴謹思維。

分類器原理闡述

??1、前向傳播:

輸入樣本從輸入層傳入,經隱層逐層處理后,傳到輸出層,計算實際輸出和期望輸出的誤差。

??2、誤差反向傳播:

運用鏈式法則,采用誤差梯度下降法對權值進行修正。

  • 重復上述過程,直到滿足一定條件:
  • 網絡實際輸出與期望輸出的總誤差 < 閾值。
  • 最近一輪訓練中所有權值變化最大值 < 閾值。
  • 算法達到最大允許的總訓練次數
    • 實驗方法
  • 對所給圖片進行讀取和處理
  • 修改圖片的命名方式,每個數字的不同樣本依次命名為:‘1.png’,’2.png’...’55.png’。方便下面數據讀取和處理。(這里自己寫了一個程序自動修改圖片名)
  • 調用data=imread(picture_name)函數讀取每張圖片數據。
  • 將得到的原始數據灰度化,數據類型轉化以及二值化。(數據類型轉化必不可少,要將uint8類型轉化為double型才能保證接下來對數據運算是正確的。一開始沒有做這一步使神經網絡每次訓練出來的輸出都是無窮大。)
  • 找到數字所在區域,去除多余的空白空間。(這一步可以有效提高學習正確率)
  • 將圖片數據由矩陣形式轉化為列向量。
  • 依次讀取所有圖片,并將圖片讀取順序打散,間接實現打散樣本。
  • 將每個數字的樣本5等份,每次取不同的一份作為測試集,其余作為訓練集。
  • 生成相應標簽矩陣:
  • ? ? ? 通過重復取單位矩陣不同列巧妙地構造出訓練和測試標簽。

  • 使用5倍交叉驗證法評估訓練模型的優劣:
  • 取好對應訓練集和測試集。
  • 初始化網絡:隱含層層數,節點數,訓練步長,訓練最大迭代次數,訓練精度等等。
  • 調用net=train(net,train_data,train_label)函數訓練神經網絡。
  • 調用test_output=sim(net,test_data)函數對測試集進行測試。
  • 計算訓練正確率。
  • 以上重復5次。
  • 以上重復3次。
    • 實驗結果

    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)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。