Keras入門級實戰 MNIST手寫體識別

2021-10-01 13:14:28 字數 3252 閱讀 5436

手寫體識別:

這裡要解決的問題是,將手寫數字的灰度影象(28 畫素×28 畫素)劃分到 10 個類別 中(0 ~ 9)。這個資料集包含 60 000 張訓練影象和 10 000 張測試圖 像,由美國國家標準與技術研究院(national institute of standards and technology,即 mnist 中 的 nist)在 20 世紀 80 年代收集得到。圖 2 - 1 給出了 mnist 資料集的 一 些樣本。

一、載入keras中mnist資料集

# 下面是輸入資料。

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

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

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

我們來看 一 下訓練資料:

下面是測試資料:

接下來的工作流程如下:

首先,將訓練資料(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)
訓練過程:

六、檢查模型在測試集上的效能

test_loss, test_acc = network.evaluate(test_images, test_labels)
測試集精度為97.8%,比訓練集精度低不少。這種差距是過擬合造成的。

後期會同步更上不同模型框架在手寫體識別上的應用。

Keras分類問題入門級

from keras.datasets import imdb train data,train labels test data,test labels imdb.load data num words 10000 num words 10000意思是只去頻率最高的10000個詞,這樣可以減少工作...

Keras入門實戰(1) MNIST手寫數字分類

目錄 1 首先我們載入keras中的資料集 2 網路架構 3 選擇編譯 compile引數 4 準備影象資料 5 訓練模型 6 測試資料 前面的部落格中已經介紹了如何在ubuntu下安裝keras深度學習框架。現在我們使用 keras 庫來學習手寫數字分類。我們這裡要解決的問題是 將手寫數字的灰度影...

photoshop例項實戰(入門級)教程

ps對街拍女孩 增加質感 2019 03 19 17 57 ps製作水火相溶特效文字 2019 03 19 17 49 ps製作簡潔漂亮的立體抽絲文字 2019 03 19 17 16 ps製作科幻特效的金色立體文字 2019 03 19 17 13 ps製作黑暗牆面上的漂亮霓虹文字 2019 03...