利用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)造成的。過擬合是指機器學習模型在新數據上的性能往往比在訓練數據上要差.
程式碼鏈接: