Mnist數據集解讀


Mnist數據集簡介

MNIST是一個手寫體數字的圖片數據集,該數據集來由美國國家標准與技術研究所(National Institute of Standards and Technology (NIST))發起整理,一共統計了來自250個不同的人手寫數字圖片,其中50%是高中生,50%來自人口普查局的工作人員。該數據集的收集目的是希望通過算法,實現對手寫數字的識別。

1998年,Yan LeCun 等人發表了論文《Gradient-Based Learning Applied to Document Recognition》,首次提出了LeNet-5 網絡,利用上述數據集實現了手寫字體的識別。

Mnist數據集官網:http://yann.lecun.com/exdb/mnist/

數據下載

官網上提供了數據集的下載,主要包括四個文件:

文件下載 文件用途
train-images-idx3-ubyte.gz 訓練集圖像
train-labels-idx1-ubyte.gz 訓練集標簽
t10k-images-idx3-ubyte.gz 測試集圖像
t10k-labels-idx1-ubyte.gz 測試集標簽

在上述文件中,訓練集一共包含了 60,000 張圖像和標簽,而測試集一共包含了 10,000 張圖像和標簽。測試集中前5000個來自最初NIST項目的訓練集.,后5000個來自最初NIST項目的測試集。前5000個比后5000個要規整,這是因為前5000個數據來自於美國人口普查局的員工,而后5000個來自於大學生。

該數據集自1998年起,被廣泛地應用於機器學習和深度學習領域,用來測試算法的效果,例如線性分類器(Linear Classifiers)、K-近鄰算法(K-Nearest Neighbors)、支持向量機(SVMs)、神經網絡(Neural Nets)、卷積神經網絡(Convolutional nets)等等。

數據集解讀

下載上述四個文件后,將其解壓會發現,得到的並不是一系列圖片,而是 .idx1-ubyte和.idx3-ubyte 格式的文件。這是一種IDX數據格式,其基本格式如下:

magic number
size in dimension 0
size in dimension 1
size in dimension 2
.....
size in dimension N
data

其中magic number為4字節,前2字節永遠是0,第3字節代表數據的格式:

0x08: unsigned byte
0x09: signed byte
0x0B: short (2 bytes)
0x0C: int (4 bytes)
0x0D: float (4 bytes)
0x0E: double (8 bytes)

第4字節的含義表示維度的數量(dimensions): 1 表示一維(比如vectors), 2 表示二維( 比如matrices),3表示三維(比如numpy表示的圖像,高,寬,通道數)。

訓練集和測試集的標簽文件的格式(train-labels-idx1-ubyte和t10k-labels-idx1-ubyte)

idx1-ubtype的文件數據格式如下:

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000801(2049) magic number (MSB first)
0004     32 bit integer  60000            number of items
0008     unsigned byte   ??               label
0009     unsigned byte   ??               label
........
xxxx     unsigned byte   ??               label
  • 第0 ~ 3字節,是32位整型數據,取值為0x00000801(2049),即用幻數2049記錄文件數據格式,這里的格式為文本格式。
  • 第4~7個字節,是32位整型數據,取值為60000(訓練集時)或10000(測試集時),用來記錄標簽數據的個數;
  • 第8個字節 ~ ),是一個無符號型的數,取值為對應0~9 之間的標簽數字,用來記錄樣本的標簽。

訓練集和測試集的圖像文件的格式(train-images-idx3-ubyte和t10k-images-idx3-ubyte)

idx3-ubtype的文件數據格式如下:

[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000803(2051) magic number
0004     32 bit integer  60000            number of images
0008     32 bit integer  28               number of rows
0012     32 bit integer  28               number of columns
0016     unsigned byte   ??               pixel
0017     unsigned byte   ??               pixel
........
xxxx     unsigned byte   ??               pixel

即:

  • 第0 ~ 3字節,是32位整型數據,取值為0x00000803(2051),即用幻數2051記錄文件數據格式,這里的格式為圖片格式。

  • 第4~7個字節,是32位整型數據,取值為60000(訓練集時)或10000(測試集時),用來記錄圖片數據的個數;

  • 第8~11個字節,是32位整型數據,取值為28,用來記錄圖片數據的高度;

  • 第12~15個字節,是32位整型數據,取值為28,用來記錄圖片數據的寬度;

  • 第16個字節 ~ ),是一個無符號型的數,取值為0~255之間的灰度值,用來記錄圖片按行展開后得到的灰度值數據,其中0表示背景(白色),255表示前景(黑色)。

數據讀取

由於數據集的格式是一個特殊的二進制文件,規則如上所述。要讀取數據,則需要按照文件數據結構進行解讀,使用到了struct,並且涉及到Endian數據結構知識。有關資料如下:

這里我們嘗試從訓練集中讀取並展示一組數據,首先將文件解壓,將train-labels.idx1-ubytetrain-images.idx3-ubyte 文件放置同一路徑下,並在此路徑新建python文件,內容如下:

import os
import struct
import numpy as np

# 讀取標簽數據集
with open('./train-labels.idx1-ubyte', 'rb') as lbpath:
    labels_magic, labels_num = struct.unpack('>II', lbpath.read(8))
    labels = np.fromfile(lbpath, dtype=np.uint8)

# 讀取圖片數據集
with open('./train-images.idx3-ubyte', 'rb') as imgpath:
    images_magic, images_num, rows, cols = struct.unpack('>IIII', imgpath.read(16))
    images = np.fromfile(imgpath, dtype=np.uint8).reshape(images_num, rows * cols) 

# 打印數據信息
print('labels_magic is {} \n'.format(labels_magic),
      'labels_num is {} \n'.format(labels_num),
      'labels is {} \n'.format(labels))

print('images_magic is {} \n'.format(images_magic),
      'images_num is {} \n'.format(images_num),
      'rows is {} \n'.format(rows),
      'cols is {} \n'.format(cols),
      'images is {} \n'.format(images))


# 測試取出一張圖片和對應標簽
import matplotlib.pyplot as plt

choose_num = 1 # 指定一個編號,你可以修改這里
label = labels[choose_num]
image = images[choose_num].reshape(28,28)

plt.imshow(image)
plt.title('the label is : {}'.format(label))
plt.show()

結果如下:

labels_magic is 2049 
 labels_num is 60000
 labels is [5 0 4 ... 5 6 8] 

images_magic is 2051
 images_num is 60000
 rows is 28
 cols is 28
 images is [[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]

當然,目前已經有許多深度學習框架已經內置了Mnist數據集,並且有相關的函數直接讀取並划分數據集,但是對數據集進行詳細的解讀十分有必要,相信有了上面的解讀,你將對Mnist數據集更加深刻!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM