MNIST是一個非常有名的手寫體數字識別數據集,在很多資料中,這個數據集都會被用作深度學習的入門樣例。而TensorFlow的封裝讓使用MNIST數據集變得更加方便。MNIST數據集是NIST數據集的一個子集,它包含了60000張圖片作為訓練數據,10000張圖片作為測試數據。在MNIST數據集中的每一張圖片都代表了0~9中的一個數字。圖片的大小都為28*28,且數字都會出現在圖片的正中間,如下圖所示:
在上圖中右側顯示了一張數字1的圖片,而右側顯示了這個圖片所對應的像素矩陣,MNIST數據集提供了4個下載文件,具體參考①,在tensorflow中可將這四個文件直接下載放於一個目錄中並加載,如下代碼input_data.read_data_sets所示,如果指定目錄中沒有數據,那么tensorflow會自動去網絡上進行下載。下面代碼介紹了如何使用tensorflow操作MNIST數據集。
from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf mnist = input_data.read_data_sets('/home/workspace/python/tf/data/mnist',one_hot=True) # 打印“Training data size: 55000” print "Training data size: ",mnist.train.num_examples # 打印“Validating data size: 5000” print "Validating data size: ",mnist.validation.num_examples # 打印“Testing data size: 10000” print "Testing data size: ",mnist.test.num_examples # 打印“Example training data: [0. 0. 0. ... 0.380 0.376 ... 0.]” print "Example training data: ",mnist.train.images[0] # 打印“Example training data label: [0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]” print "Example training data label: ",mnist.train.labels[0] batch_size = 100 # 從train的集合中選取batch_size個訓練數據 xs, ys = mnist.train.next_batch(batch_size) # 輸出“X shape:(100,784)” print "X shape: ", xs.shape # 輸出"Y shape:(100,10)" print "Y shape: ", ys.shape
從上面的代碼中可以看出,通過input_data.read_data_sets函數生成的類會自動將MNIST數據集划分為train, validation和test三個數據集,其中train這個集合內含有55000張圖片,validation集合內含有5000張圖片,這兩個集合組成了MNIST本身提供的訓練數據集。test集合內有10000張圖片,這些圖片都來自與MNIST提供的測試數據集。處理后的每一張圖片是一個長度為784的一維數組,這個數組中的元素對應了圖片像素矩陣中的每一個數字(28*28=784)。因為神經網絡的輸入是一個特征向量,所以在此把一張二維圖像的像素矩陣放到一個一維數組中可以方便tensorflow將圖片的像素矩陣提供給神經網絡的輸入層。像素矩陣中元素的取值范圍為[0, 1],它代表了顏色的深淺。其中0表示白色背景,1表示黑色前景。為了方便使用隨機梯度下降,input_data.read_data_sets函數生成的類還提供了mnist.train.next_batch函數,它可以從所有的訓練數據中讀取一小部分作為一個訓練batch。
mnist.train.xs訓練集特征
mnist.train.ys訓練集分類標簽
軟件版本
TensorFlow 1.0.1 + Python 2.7.12
參考
①、Yann LeCun教授網站中對MNIST數據集的詳細介紹及數據下載。
②、tensorflow官網對MNIST數據集的介紹及部分操作。
③、《TensorFlow實戰Google深度學習框架》第五章。