MATLAB手寫數字識別

2021-09-25 17:57:03 字數 2772 閱讀 2316

本文主要是根據《matlab手寫神經網路實現識別手寫數字》部落格中的**進行試驗。由於沒有資料集,所以採用了mnist資料集進行**的執行。資料集不同所以需要對**進行微小改動。

資料處理:4000張作為訓練樣本,1000張作為測試樣本;

影象大小:的灰度值矩陣(28,28);

影象名稱:由標籤和順序號組成。標籤_順序號.bmp

訓練樣本:每個數字的影象名稱的順序號是從0-399,各400個。

測試樣本:每個數字的影象名稱的順序號是從401-500,各100個。

標籤格式:

訓練資料集中前400個標籤都是[1,0,0,0,0,0,0,0,0,0]代表數字0,401-800個標籤都是[0,1,0,0,0,0,0,0,0,0]代表數字2,其餘類推。這也就是所謂的onehot

由於資料集不同,影象的格式也不一樣等因素,需要對**稍微做修改,具體如下:

製作label時遇到的障礙,xlswrite()函式在寫入矩陣時對矩陣大小有限制,一定要小心,因為我的電腦安裝的是2003,所以無法對4000列資料直接寫入,只好行列互換後再儲存,**將生成兩個xsl檔案,分別是label.xsl和label2.xsl,分別是訓練資料和測試資料的標籤。

增加乙個label_create.m檔案,用來新建標籤檔案。

label_create.m**:

% 建立excel儲存label

% 為了轉換成神經網路的標籤,0-9這10個標籤應轉換為[1,0,0,0,0,0,0,0,0,0],[0,1,0,0,0,0,0,0,0,0]

% 這樣的格式,即第幾位是1就代表標籤是幾?如[0,1,0,0,0,0,0,0,0,0]代表2

% 例如我們的前 400個圖都是0,所以標籤都是[1,0,0,0,0,0,0,0,0,0]

% 因為每個版本的excel允許儲存的行列不同,這裡是2003版儲存不下4000列,故需要將label矩陣轉置後才能存下

% excel2003可儲存:65536*256

clear all;

clc;

label=zeros(10,4000);

label2=zeros(10,1000);

eye_sam=eye(10);

for j=1:10

label(:,(400*(j-1)+1):400*j)= repmat( eye_sam(:,j),1,400 );

endt=label';

xlswrite('d:\documents\matlab\label.xls',t);

for j=1:10

label2(:,(100*(j-1)+1):100*j)= repmat( eye_sam(:,j),1,100 );

endt2=label2';

xlswrite('d:\documents\matlab\label2.xls',t2);

getdata.m**修改:

function[x_train,y_train,x_test,y_test]=getdata()

% 把變成畫素矩陣

% path :路徑

% x_train:訓練樣本畫素矩陣(784,4000)

% y_train:訓練樣本標籤(10,4000)

% x_test:測試樣本畫素矩陣(784,1000)

% y_test:測試樣本標籤(10,1000)

x_train = ;

for i=0:9

for j=0:399

x=im2double(imread(strcat('d:\documents\matlab\images4000\',num2str(i),'_', num2str(j),'.bmp')));

x=reshape(x,784,1); % 將28*28的數值矩陣變為784*1,每列代表一幅圖

x_train = [x_train,x]; % 每迴圈一次加入一列資料

endendx_test =;

for i=0:9

for j=401:500

x=im2double(imread(strcat('d:\documents\matlab\images_test1000\',num2str(i),'_', num2str(j),'.bmp')));

x=reshape(x,784,1); % 將28*28的數值矩陣變為784*1,每列代表一幅圖

x_test = [x_test,x]; % 每迴圈一次加入一列資料

endend% 讀取標籤檔案,注意:由於標籤的儲存問題,讀入後需要進行轉置

data=xlsread('label.xls');

data2=xlsread('label2.xls');

y_train=data';

y_test = data2';

% 返回的引數

x_train;

y_train;

x_test;

y_test;

end

其餘**保持和原部落格中的一致。全部檔案如下圖:

執行main.m檔案即可。

參考:

手寫數字識別

這幾天在想這做字元識別方面的程式,看了很多 但是發現 上的幾乎用處都不是特別的大,理論一大堆,但是用在程式裡面則很難實現,看到有些 上說用連碼法,但是連碼法對結構的變化太敏感了,但是也從一些 裡獲得了一些靈感,我採用的是網格匹配法,準備工作採集樣本,得到了樣本的網格資訊用於接下來的識別,當然也可 一...

手寫數字識別

import os os.environ tf cpp min log level 2 不想讓警告的資訊輸出可以新增 from tensorflow.examples.tutorials.mnist import input data import tensorflow as tf def mnis...

手寫數字識別 實戰 KNN演算法識別手寫數字

鄰近演算法,或者說k最近鄰 knn,k nearestneighbor 分類演算法是資料探勘分類技術中最簡單的方法之一。所謂k最近鄰,就是k個最近的鄰居的意思,說的是每個樣本都可以用它最接近的k個鄰居來代表。下面是我學習knn演算法的思維導圖 其中距離的定義,各個距離的公式為 歐氏距離 n維空間的距...