本文主要是根據《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維空間的距...