初始神經網絡python
這裏要解決的問題是,將手寫數字的灰度圖像(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)形成的。過擬合是指機器學習模型在新數據上的性能每每比在訓練數據上要差.
代碼連接: