初學者的 Keras:實現卷積神經網絡

初學者的 Keras:實現卷積神經網絡

Keras是一個簡單易用但功能強大的 Python 深度學習庫。在這篇文章中,我們將用 Keras 構建一個簡單的卷積神經網絡(CNN),並訓練它來解實際問題。

這篇文章適用於完全初學 Keras 的人,但假設有 CNNs 的基本背景知識。我對卷積神經網絡的介紹涵蓋了你在這篇文章中需要知道的一切(以及更多內容),如果需要,請先閱讀。

我們現在就開始!

想要代碼嗎?完整的源代碼在末尾。

問題:MNIST數字分類

我們將處理一個經典的計算機視覺入門問題:MNIST 手寫數字分類。很簡單:給定一個圖像,將其分類為一個數字。

初學者的 Keras:實現卷積神經網絡

MNIST 數據集中的樣本圖像

MNIST 數據集中的每個圖像都是 28x28,包含一個居中的灰度數字。我們的 CNN 將獲取一個圖像並輸出 10 個可能的類中的一個(每個數字一個)。

1. 安裝

我假設你已經有了一個基本的 Python 安裝(可能是這樣)。讓我們先下載一些我們需要的包:

初學者的 Keras:實現卷積神經網絡

注意:我們需要安裝 tensorflow ,因為我們要在 TensorFlow 後端上運行 Keras(即 TensorFlow 將裝備 Keras )。

現在你應該能夠導入這些包並瀏覽 MNIST 數據集:

初學者的 Keras:實現卷積神經網絡

2. 準備數據

在開始之前,我們將把圖像像素值從 [0,255] 規範化為 [-0.5,0.5] 以使網絡更容易訓練(使用較小的中心值通常會得到更好的結果)。我們還將把每個圖像從(28,28)改為(28,28,1),因為 Keras 需要第三維度。

初學者的 Keras:實現卷積神經網絡

我們準備好開始構建我們的 CNN 了!

3. 構建模型

每個 Keras 模型要麼使用表示層的線性堆棧的 Sequential 類構建,要麼使用更可定製的功能 Model 類。我們將使用更簡單的Sequential 模型,因為我們的 CNN 將是一個層的線性堆棧。

我們首先實例化一個 Sequential 模型:

初學者的 Keras:實現卷積神經網絡

Sequential 構造函數接受一個 Keras Layers 數組。我們將為 CNN 使用三種類型的層:卷積層、最大池層和 Softmax 層。

初學者的 Keras:實現卷積神經網絡

這是我們在我的 CNN 簡介中使用的 CNN 設置。如果你對這三種層的任何一種都不滿意的話,請閱讀這篇文章。

初學者的 Keras:實現卷積神經網絡

  • num_filters, filter_size 和 pool_size 是設置 CNN 超參數的自解釋變量。
  • 任何 Sequential 模型中的第一層都必須指定輸入 input_shape,因此我們在 Conv2D上執行此操作。一旦指定了此輸入形狀,Keras 將自動推斷後續層的輸入形狀。
  • Softmax 輸出層有 10 個節點,每個類一個。

4. 編譯模型

在開始培訓之前,我們需要配置訓練過程。我們在編譯過程中確定了3個關鍵因素:

  • 優化器。我們將堅持用一個非常好的默認設置:Adam 基於梯度的優化器。Keras 還有許多其他優化器,你也可以查看。
  • 損失函數。因為我們使用的是 SoftMax 輸出層,所以我們將使用交叉熵損失。Keras 區分 binary_crossentropy (2類)和 categorical_crossentropy(>2 類),因此我們將使用後者。查看所有的 Keras 損失函數.
  • 度量列表。因為這是一個分類問題,所以我們只會有關於準確度度量的 Keras 報告。

下面是編譯的樣子:

初學者的 Keras:實現卷積神經網絡

走起!

5. 訓練模型

在 Keras 中訓練模型實際上只包括調用 fit() 和指定一些參數。有很多可能的參數,但我們只提供這些:

  • 訓練數據(圖像和標籤),通常分別稱為 X 和 Y。
  • 訓練的 epoch 數(整個數據集的迭代次數)。
  • 驗證數據(或測試數據),在訓練期間用於根據以前從未見過的數據定期測量網絡性能。

有一件事我們必須小心:Keras 期望訓練目標是 10 維向量,因為我們的 Softmax 輸出層中有 10 個節點。現在,我們的 train_labels 和 test_labels 數組包含表示每個圖像的類的單個整數:

初學者的 Keras:實現卷積神經網絡

很方便,Keras 有一個實用的方法來解決這個確切的問題:to_categorical。它將整數類數組轉換為一個獨熱向量數組。例如,2 將變為[0, 0, 1, 0, 0, 0, 0, 0, 0, 0](它是從零索引)。

這就是它的樣子:

初學者的 Keras:實現卷積神經網絡

我們現在可以把所有的東西放在一起訓練我們的網絡:

初學者的 Keras:實現卷積神經網絡

在完整 MNIST 數據集上運行該代碼可以得到如下結果:

初學者的 Keras:實現卷積神經網絡

我們用這個簡單的 CNN 達到了 97.4% 的測試精度!

6. 使用模型

既然我們有了一個有效的、經過訓練的模型,讓我們來使用它。我們要做的第一件事是將它保存到磁盤上,這樣我們就可以隨時加載它:

初學者的 Keras:實現卷積神經網絡

通過重建模型並加載保存的權重,我們現在可以在任何需要的時候重新加載經過訓練的模型:

初學者的 Keras:實現卷積神經網絡

使用經過訓練的模型進行預測很容易:我們將輸入數組傳遞給 predict(),它返回一個輸出數組。請記住,我們網絡的輸出是 10 個概率(因為 softmax),所以我們將使用 np.argmax() 將這些轉換為實際數字。

初學者的 Keras:實現卷積神經網絡

8. 擴展

我們還可以做更多的實驗並改進我們的網絡 - 在這個官方的 Keras MNIST CNN 例子中,他們在 12 個 epochs 後達到了99.25% 的測試精度。你可以對我們的 CNN 進行修改的一些例子包括:

網絡深度

如果我們添加或刪除 Convolutional 層會發生什麼?這將如何影響訓練和/或模型的最終性能?

初學者的 Keras:實現卷積神經網絡

Dropout

如果我們嘗試添加通常用來防止過擬合的 Dropout 層會發生什麼?

初學者的 Keras:實現卷積神經網絡

全連接層

如果我們在 Convolutional 輸出和最終的 Softmax 層之間添加全連接層會發生什麼?這是 CNNs 中用於計算機視覺的常見操作。

初學者的 Keras:實現卷積神經網絡

卷積參數

如果我們使用 Conv2D 參數會發生什麼?例如:

初學者的 Keras:實現卷積神經網絡

結語

你已經用 Keras 實現了你的第一個 CNN!我們通過首個簡單網絡獲得了 97.4% 的測試精度。我在下面再加一次完整的源代碼供你參考。

你可能感興趣的擴展閱讀包括:

  • 官方的 Keras 入門指南。
  • 我關於導出訓練 CNNs 的反向傳播算法的文章。
  • Keras 示例集錦.
  • 更多關於神經網絡的文章.


謝謝你的閱讀!完整的源代碼如下。

完整代碼

初學者的 Keras:實現卷積神經網絡


英文原文:https://victorzhou.com/blog/keras-cnn-tutorial/ 譯者:青書


分享到:


相關文章: