利用mnist數據集進行深度神經網絡

  • 2020 年 3 月 17 日
  • 筆記

初始神經網絡

這裡要解決的問題是,將手寫數字的灰度圖像(28 像素 x28 像素)劃分到 10 個類別中(0~9)。我們將使用 MINST 數據集,它是機器學習領域的一個經典數據集,其歷史幾乎和這個領域一樣長,而且已被人們深入研究。這個數據集包含 60000 張訓練圖像和 10000 張測試圖像,由美國國家標準與技術研究院(National Institute of Standards and Technology,即 MINIST 中的 NIST)在 20 世紀 80 年代收集得到。你可以將「解決」MINIST 問題看作深度學習的「Belo World」,正是用它來驗證你的算法是否按預期運行。當你成為機器學習從業者後,會發現 MINIST 一次又一次地出現在科學論文、博客文章等中。下圖給出了 MINIST 數據集的一些樣本。

MINST 數據集預先加載在 Keras 庫中,其中包括 4 個 Numpy 數組。

(train_images,train_labels),(test_images,test_labels)=mnist.load_data()

下載完車給後是這樣的

Downloading data from https://s3.amazonaws.com/img-datasets/mnist.npz

11493376/11490434 [==============================] – 0s 0us/step

Train_ Images 和 traln_1 abels 組成了訓練集(training set),模型將從這些數據中進學習。然後在測試集(test set,即 test_ Images 和 test_ labels)上對模型進行測試。

圖像被編碼為 Numpy 數組,而標籤是數字數組,取值範圍為 0~9。圖像和標籤一一對應。我們來看一下訓練數據:

[3] train images. Shape   (60000,2828    [5] 1 train labels. Shape  C (60000

接下來的工作流程如下:首先,將訓練數據(traln_ Images 和 traln_1 abes)輸人神經網絡;其次,網絡學習將圖像和標籤關聯在一起;最後,網絡對 test_ Images 生成預測而我們將驗證這些預測與 test_1 abe1 s 中的標籤是否匹配。

網絡架構

from keras import models, layers  network = models.Sequential()  network.add(layers.Dense(512,activation='relu',input_shape=(28*28, )))  network.add(layers.Dense(10,activation='softmax'))

神經網絡的核心組件是層(layer),它是一種數據處理模塊,你可以將它看成數據過濾器。進去一些數據,出來的數據變得更加有用。具體來說,層從輸入數據中提取表示一一我們期望這種表示有助於解決手頭的問題。大多數深度學習都是將簡單的層鏈接起來,從而實現漸進式的數據蒸餾(data distillation)。深度學習模型就像是數據處理的篩子,包含一系列越來越精細的數據過濾器(即層)

通過summary可以查看該網絡結構已經參數

Model: "sequential_6"  _________________________________________________________________  Layer (type)                 Output Shape              Param #  =================================================================  dense_4 (Dense)              (None, 512)               401920  _________________________________________________________________  dense_5 (Dense)              (None, 10)                5130  =================================================================  Total params: 407,050  Trainable params: 407,050  Non-trainable params: 0  _________________________________________________________________

本例中的網絡包含 2 個 Dense 層,它們是密集連接(也叫全連接)的神經層。第二層(也是最後一層)是一個 10 路 softmax 層,它將返回一個由 10 個概率值(總和為 1) 組成的數組。每個概率值表示當前數字圖像屬於 10 個數字類別中某一個的概率。

要想訓練網絡,我們還需要選擇編譯(compile)步驟的三個參數。

  • 損失函數(loss function):網絡如何衡量在訓練數據上的性能,即網絡如何朝着正確的方向前進。

  • 優化器(optimizer):基於訓練數據和損失函數來更新網絡的機制。

  • 在訓練和測試過程中需要監控的指標(metric):本例只關心精度,即正確分類的圖像所佔的比例。

編譯步驟

network.compile(optimizer='rmsprop',                  loss='categorical_crossentropy',                  metrics=['accuracy'])

在開始訓練之前,我們將對數據進行預處理,將其變換為網絡要求的形狀,並縮放到所有值都在【0,11 區間。比如,之前訓練圖像保存在一個 uint8 類型的數組中,其形狀為(60000,28,28),取值區間為【0,255]。我們需要將其変換為一個 f1 oat32 數組,其形狀為(60000,28*28),取值範圍為 0~1。

準備圖像數據

train_images = train_images.reshape((60000,28*28))  train_images = train_images.astype('float32') / 225    test_images = test_images.reshape((10000,28*28))  test_images = test_images.astype('float32') / 225

準備標籤

from keras.utils import to_categorical    train_labels = to_categorical(train_labels)  test_labels = to_categorical(test_labels)

現在我們準備開始訓練網絡,在 Keras 中這一步是通過調用網絡的 fit 方法來完成的我們在訓練數據上擬合(fit)模型。

.......  60000/60000 [=============] - 4s 67us/step - loss: 2.6875e-04 - acc: 1.0000  Epoch 100/100  60000/60000 [=============] - 4s 67us/step - loss: 2.6875e-04 - acc: 1.0000  <keras.callbacks.History at 0x7f5990492eb8>

訓練過程中顯示了兩個數字:一個是網絡在訓練數據上的損失(1 oss),另一個是網絡在訓練數據上的精度(acc)

我們很快就在訓練數據上達到了 1.0000 (100%)的精度。現在我們來檢査一下模型在測試集上的性能。

test_loss, test_acc = network.evaluate(test_images,test_labels)

測試集精度為 98.38%,比訓練集精度低不少。訓練精度和測試精度之間的這種差距是過擬合(overfit)造成的。過擬合是指機器學習模型在新數據上的性能往往比在訓練數據上要差.

代碼鏈接: