1. 程式人生 > >利用mnist資料集進行深度神經網路

利用mnist資料集進行深度神經網路

初始神經網路 這裡要解決的問題是,將手寫數字的灰度影象(28 畫素 x28 畫素)劃分到 10 個類別中(0~9)。我們將使用 MINST 資料集,它是機器學習領域的一個經典資料集,其歷史幾乎和這個領域一樣長,而且已被人們深入研究。這個資料集包含 60000 張訓練影象和 10000 張測試影象,由美國國家標準與技術研究院(National Institute of Standards and Technology,即 MINIST 中的 NIST)在 20 世紀 80 年代收集得到。你可以將“解決”MINIST 問題看作深度學習的“Belo World”,正是用它來驗證你的演算法是否按預期執行。當你成為機器學習從業者後,會發現 MINIST 一次又一次地出現在科學論文、部落格文章等中。下圖給出了 MINIST 資料集的一些樣本。 ![](https://img2020.cnblogs.com/blog/1479469/202003/1479469-20200317214701611-910242817.png) MINST 資料集預先載入在 Keras 庫中,其中包括 4 個 Numpy 陣列。 ```python (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 中的標籤是否匹配。 網路架構 ```python 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):本例只關心精度,即正確分類的影象所佔的比例。 編譯步驟 ```python network.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy']) ``` 在開始訓練之前,我們將對資料進行預處理,將其變換為網路要求的形狀,並縮放到所有值都在【0,11 區間。比如,之前訓練影象儲存在一個 uint8 型別的陣列中,其形狀為(60000,28,28),取值區間為【0,255]。我們需要將其変換為一個 f1 oat32 陣列,其形狀為(60000,28*28),取值範圍為 0~1。 準備影象資料 ```python 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 ``` 準備標籤 ```python 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 ``` 訓練過程中顯示了兩個數字:一個是網路在訓練資料上的損失(1 oss),另一個是網路在訓練資料上的精度(acc) 我們很快就在訓練資料上達到了 1.0000 (100%)的精度。現在我們來檢査一下模型在測試集上的效能。 ```python test_loss, test_acc = network.evaluate(test_images,test_labels) ``` 測試集精度為 98.38%,比訓練集精度低不少。訓練精度和測試精度之間的這種差距是過擬合(overfit)造成的。過擬合是指機器學習模型在新資料上的效能往往比在訓練資料上要差. 代