首先介紹MNIST 數據集。如圖1-1 所示, MNIST 數據集主要由一些手寫數字的圖片和相應的標籤組成,圖片一共有10 類,分別對應從0~9 ,共10 個阿拉伯數字。python
原始的MNIST 數據庫一共包含下面4 個文件, 見表1-1 。數據庫
在表1 - 1 中,圖像數據是指不少張手寫字符的圖像,圖像的標籤是指每一張圖像實際對應的數字是幾,也就是說,在MNIST 數據集中的每一張圖像都事先標明瞭對應的數字。機器學習
在MNIST 數據集中有兩類圖像:一類是訓練圖像(對應文件train-images-idx3-ubyte.gz 和train - labels-idx1-ubyte.gz ), 另外一類是測試圖像(對應文件t10k-images-idx3-ubyte.gz 和t10k-labels-idx1-ubyte.gz ) 。訓練圖像一共有60000 張,供研究人員訓練出合適的模型。測試圖像一共有10000 張,供研究人員測試訓練的模型的性能。在TensorFlow 中, 可使用下面的Python 代碼下載MNIST 數據(在隨書附贈的代碼中,該代碼對應的文件是donwload.py )。性能
# 從tensorflow.examples.tutorials.mnist引入模塊。這是TensorFlow爲了教學MNIST而提早編制的程序 from tensorflow.examples.tutorials.mnist import input_data # 從MNIST_data/中讀取MNIST數據。這條語句在數據不存在時,會自動執行下載 mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
在執行語句mnist = input_ data.read_ data_ sets("MNIST_data/」,one_hot=True)時, TensorFlow 會檢測數據是否存在。當數據不存在時,系統會自動將數據下載到MNIST_data/ 文件夾中。當執行完語句後,讀者能夠自行前往MNIST_data/ 文件夾下查看上述4 個文件是否已經被正確地下載。學習
成功加載MNIST 數據集後,獲得了一個mnist 對象,能夠經過mnist對象的屬性訪問到MNIST 數據集,見表1 -2 。測試
運行下列代碼能夠查看各個變量的形狀大小:編碼
# 查看訓練數據的大小 print(mnist.train.images.shape) print(mnist.train.labels.shape) # 查看驗證數據的大小 print(mnist.validation.images.shape) print(mnist.validation.labels.shape) # 查看測試數據的大小 print(mnist.test.images.shape) print(mnist.test.labels.shape)
原始的MNIST 數據集中包含了 60000 張訓練圖片和10000 張測試圖片。而在TensorFlow 中,又將原先的60000 張訓練圖片從新劃分紅了新的55000張訓練圖片和5000 張驗證圖片。因此在mnist 對象中,數據一共分爲三部分: mnist.train 是訓練圖片數據, mnist. validation 是驗證圖片數據, mnist.test是測試圖片數據,這正好對應了機器學習中的訓練集、驗證集和測試集。通常來講,會在訓練集上訓練模型,經過模型在驗證集上的表現調整參數,最後經過測試集肯定模型的性能。spa
在原始的MNIST 數據集中,每張圖片都由一個28 ×28 的矩陣表示,如圖 所示。對象
在TensorFlow 中,變量mnist.train.images 是訓練樣本, 它的形狀爲(55000,784)。其中,5000 是訓練圖像的個數,而784 實際爲單個樣本的維數,即每張圖片都由一個784 維的向量表示( 784 正好等於28 ×28 ) 。可使用如下代碼打印出第0 張訓練圖片對應的向量表示:blog
# 打印出第0張圖片的向量表示 print(mnist.train.images[0,:]) # 打印出第0幅圖片的標籤 print(mnist.train.labels[0, :])
爲了加深對這種表示的理解,下面完成一個簡單的程序:將MNIST 數據集讀取出來,並保存爲圖片文件。對應的代碼文件爲save_pic.py。
from tensorflow.examples.tutorials.mnist import input_data import scipy.misc import os # 讀取MNIST數據集。若是不存在會事先下載 mnist = input_data.read_data_sets("MNIST_data/",one_hot=True) # 把原始圖片保存在MNIST_data/raw/文件夾下 若是沒有這個文件夾 會自動建立 save_dir = 'MNIST_data/raw/' if os.path.exists(save_dir) is False: os.mkdir(save_dir) # 保存前20張圖片 for i in range(20): # 請注意,mnist.train.images[i, :]就表示第i張圖片(序號從0開始) image_array = mnist.train.images[i,:] # TensorFlow中的MNIST圖片是一個784維的向量,咱們從新把它還原爲28x28維的圖像。 image_array = image_array.reshape(28,28) # 保存文件的格式爲 mnist_train_0.jpg, mnist_train_1.jpg, ... ,mnist_train_19.jpg filename = save_dir+'mnist_train_%d.jpg' % i # 將image_array保存爲圖片 # 先用scipy.misc.toimage轉換爲圖像,再調用save直接保存。 scipy.misc.toimage(image_array,cmin=0.0,cmax=1.0).save(filename) # 版本不支持可是仍是能夠保存爲圖片
運行此程序後, 在MNIST_data/raw/ 文件夾下就能夠看到MNIST 數據集中訓練集的前20 張圖片。
變量mnist. train.labels 表示訓練圖像的標籤,它的形狀是(55000, 10)。原始的圖像標籤是數字0~9 ,咱們徹底能夠用一個數字來存儲圖像標籤,但爲何這裏每一個訓練標籤是一個10 維的向量呢?其實,這個10 維的向量是原先類別號的獨熱( one-hot )表示。所謂獨熱表示,就是「一位高效編碼」 。咱們用N維的向量來表示N 個類別,每一個類別佔據獨立的一位,任什麼時候候獨熱表示中只再一位是1 ,其餘都爲0 。讀者能夠直接從表中理解獨熱表示。
咱們能夠打印出前20 張圖片的標籤(對應程序label.py ),讀者能夠嘗試與前面程序中保存的圖片對照,查看圖像與圖像的標籤是否正確地對應上了。
from tensorflow.examples.tutorials.mnist import input_data import numpy as np # 讀取MNIST數據集。若是不存在會事先下載 mnist = input_data.read_data_sets("MNIST_data/",one_hot=True) # 看前20張訓練圖片的label for i in range(20): # 獲得獨熱表示,形如(0, 1, 0, 0, 0, 0, 0, 0, 0, 0) one_hot_label = mnist.train.labels[i,:] # 經過np.argmax咱們能夠直接得到原始的label # 由於只有1位爲1,其餘都是0 label = np.argmax(one_hot_label) print('mnist_train_%d.jpg label: %d' % (i, label))