1. 程式人生 > 實用技巧 >第一個神經網路簡潔示例

第一個神經網路簡潔示例

以下內容來自《python深度學習》,僅作學習筆記記錄~

第一個神經網路示例——使用 Python 的 Keras 庫來學習手寫數字分類

在機器學習中,分類問題中的某個類別叫作類(class)。資料點叫作樣本(sample)。某個樣本對應的類叫作標籤(label)。

將手寫數字的灰度影象(28 畫素×28 畫素)劃分到 10 個類別 中(0~9)。使用 MNIST 資料集,這個資料集包含 60000 張訓練影象和10000 張測試影象。MNIST 資料集預先載入在 Keras 庫中,其中包括 4 個 Numpy 陣列。

from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels)
=mnist.load_data()
載入 Keras 中的 MNIST 資料集

train_images 和 train_labels 組成了訓練集(training set),模型將從這些資料中進行學習。然後在測試集(test set,即 test_images 和 test_labels)上對模型進行測試。 影象被編碼為 Numpy 陣列,而標籤是數字陣列,取值範圍為 0~9。影象和標籤一一對應。

train_images.shape (60000, 28, 28)
len(train_labels) 60000 
train_labels array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
訓練資料
test_images.shape (10000, 28, 28)
len(test_labels) 10000
test_labels array([7, 2, 1, ..., 4, 5, 6], dtype=uint8) 
測試資料

接下來的工作流程如下:

首先,將訓練資料(train_images 和 train_labels)輸入神經網路;其次,網路學習將影象和標籤關聯在一起;最後,網路對 test_images 生成預測, 而我們將驗證這些預測與 test_labels 中的標籤是否匹配。 下面我們來構建網路。

from keras import models 
from keras import
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)。深度學習模型就像是資料處理的篩子,包含一系列越來越精細的 資料過濾器(即層)。

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

要想訓練網路,我們還需要選擇編譯(compile)步驟的三個引數:

損失函式(loss function):網路如何衡量在訓練資料上的效能,即網路如何朝著正確的 方向前進。

優化器(optimizer):基於訓練資料和損失函式來更新網路的機制。

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

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

在開始訓練之前,我們將對資料進行預處理,將其變換為網路要求的形狀,並縮放到所 有值都在 [0, 1] 區間。

比如,之前訓練影象儲存在一個 uint8 型別的陣列中,其形狀為 (60000, 28, 28),取值區間為 [0, 255]。我們需要將其變換為一個 float32 陣列,其形 狀為 (60000, 28 * 28),取值範圍為 0~1。

train_images = train_images.reshape((60000, 28 * 28)) train_images = train_images.astype('float32') / 255
test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255 
準備影象資料
from keras.utils import to_categorical
train_labels = to_categorical(train_labels) 
test_labels = to_categorical(test_labels)
準備標籤

現在準備開始訓練網路,在 Keras 中這一步是通過呼叫網路的 fit 方法來完成的—— 我們在訓練資料上擬合(fit)模型。

network.fit(train_images, train_labels, epochs=5, batch_size=128) 
##輸出
#Epoch 1/5 
#60000/60000 [=============================] - 9s - loss: 0.2524 - acc: 0.9273
#Epoch 2/5 
#51328/60000 [=======================>.....] - ETA: 1s - loss: 0.1035 - acc: 0.9692

訓練過程中顯示了兩個數字:一個是網路在訓練資料上的損失(loss),另一個是網路在 訓練資料上的精度(acc)。我們很快就在訓練資料上達到了 0.989(98.9%)的精度。

test_loss, test_acc = network.evaluate(test_images, test_labels)  print('test_acc:', test_acc) 
#輸出test_acc: 0.9785 
檢查模型在測試集上的效能

測試集精度為 97.8%,比訓練集精度低不少。訓練精度和測試精度之間的這種差距是過擬合(overfit)造成的。過擬合是指機器學習模型在新資料上的效能往往比在訓練資料上要差。 第一個例子到這裡就結束了。你剛剛看到了如何構建和訓練一個神經網路,用不到 20 行的 Python 程式碼對手寫數字進行分類。