手寫數字識別是機器學習里面的一個經典問題,今天就這一段時間學習的機器學習,花一個下午茶的時間,試試機器學習。
首先數據庫是在MNIST(http://yann.lecun.com/exdb/mnist/)下載下來的。下載下來的數據如下圖所示。官方有給出數據怎么讀取,我自己沒有仔細看,因為我看到網上有人公布代碼如何讀取。
可以看到前四個是測試數據,后四個是訓練數據。

這里我用matlab嘗試讀取這些數據。
首先看兩個function。
loadMNISTImages.m
function images = loadMNISTImages(filename) %loadMNISTImages returns a 28x28x[number of MNIST images] matrix containing %the raw MNIST images fp = fopen(filename, 'rb'); assert(fp ~= -1, ['Could not open ', filename, '']); magic = fread(fp, 1, 'int32', 0, 'ieee-be'); assert(magic == 2051, ['Bad magic number in ', filename, '']); numImages = fread(fp, 1, 'int32', 0, 'ieee-be'); numRows = fread(fp, 1, 'int32', 0, 'ieee-be'); numCols = fread(fp, 1, 'int32', 0, 'ieee-be'); images = fread(fp, inf, 'unsigned char'); images = reshape(images, numCols, numRows, numImages); images = permute(images,[2 1 3]); fclose(fp); % Reshape to #pixels x #examples images = reshape(images, size(images, 1) * size(images, 2), size(images, 3)); % Convert to double and rescale to [0,1] images = double(images) / 255; end
loadMNISTLabels.m
function labels = loadMNISTLabels(filename) %loadMNISTLabels returns a [number of MNIST images]x1 matrix containing %the labels for the MNIST images fp = fopen(filename, 'rb'); assert(fp ~= -1, ['Could not open ', filename, '']); magic = fread(fp, 1, 'int32', 0, 'ieee-be'); assert(magic == 2049, ['Bad magic number in ', filename, '']); numLabels = fread(fp, 1, 'int32', 0, 'ieee-be'); labels = fread(fp, inf, 'unsigned char'); assert(size(labels,1) == numLabels, 'Mismatch in label count'); fclose(fp); end
這兩個函數就可以讀取相應的數據。

這個函數返回的訓練數據集是784*60000的矩陣,這個可以看到是每一列是一個圖片,總共是60000列,這些總共有10個數字,從0到9。也就是說每個數字在6000個左右。我們先取出來第一列看看。

可以看到C是一個取出來的一個28*28的矩陣,就是一個圖片。
矩陣打印出來如下:
可以看到應該是一個數字5。這里的0在圖片里就是黑色,有數字的就是白色,看到都是小數,所以應該是標准化之后的,我們把矩陣乘以255后打印出來:

可以看到打印出來就是這個樣子。應該是個數字5。下面看讀取label。

看第一個數字是:

可以看到label是對應60000個數字,每個數字對應的數字大概在6000個,我打印出來每個數字的個數:
代碼:

結果:

LA0里的每個數字都是LA中數字為0的下標。

