MNIST是一個非常有名的手寫體數字識別數據集,MNIST數據集是NIST數據集的一個子集,它包含了60000張圖片作爲訓練數據,10000張圖片作爲測試數據,在MNIST數據集中的每一張圖片都代表了0~9中的一個數字,圖片的大小都爲28 × 28,且數字都會出現在圖片的正中間。
在Yann LeCun教授的網站中:http://yann.lecun.com/exdb/mnist, 對MNIST數據集做出了詳細的介紹,MNIST數據集提供了4個下載文件,筆者將這4個下載文件的鏈接在以下表格中進行了陳列,朋友們可以選擇直接點擊下載,也可以選擇到Yann LeCun教授的網站去下載,注意,這4個文件下載後無需解壓:
雖然MNIST數據集只提供了訓練和測試數據,但是爲了驗證模型訓練的效果,一般會從訓練數據中劃分出一部分數據作爲驗證(validation)數據。
爲了方便使用,TensorFlow提供了一個類來處理MNIST數據,這個類會自動下載並轉化MNIST數據的格式,並將數據從原始的數據包中解析成訓練和測試神經網絡時使用的格式,通過下列代碼來了解一下這個類:
from tensorflow.examples.tutorials.mnist import input_data
#載入MNIST數據集,如果指定路徑datasets/MNIST_ data/下沒有已經下載好的數據,那麼TensorFlow會自動從數據集所在網址下載數據
mnist = input_data.read_data_sets("datasets/MNIST_data/", one_hot=True)
print("Training data size: ", mnist.train.num_examples)
print("Validating data size: ", mnist.validation.num_examples)
print("Testing data size: ", mnist.test.num_examples)
print("Example training data: ", mnist.train.images[0])
print("Example training data label: ", mnist.train.labels[0])
通過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表示白色背景(background),1表示黑色前景(foreground)。
爲了方便使用隨機梯度下降,input_data.read_data_sets函數生成的類還提供了mnist.train.next_batch函數,它可以從所有的訓練數據中讀取一小部分作爲一個訓練batch,以下代碼顯示瞭如何使用這個功能:
batch_size = 100
#從train的集合中選取batch_size個訓練數據
xs, ys = mnist.train.next_batch(batch_size)
'''輸出結果爲:
X shape: (100, 784)
Y shape: (100, 10)'''
print("X shape:", xs.shape)
print("Y shape:", ys.shape)