初始神經網路
這里要解決的問題是,將手寫數字的灰度影像(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)造成的,過擬合是指機器學習模型在新資料上的性能往往比在訓練資料上要差.
代碼鏈接:
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/45452.html
標籤:其他
上一篇:從線性回歸到神經網路
