1. 程式人生 > >第14章 LeNet:識別手寫數字

第14章 LeNet:識別手寫數字

文件包含 ali 2個 程序代碼 cnn 代碼 出了 ieee 隱藏

第14章 LeNet:識別手寫數字

LeNet架構時深度學習社區的一個開創性工作,見論文【1】,作者在實現LeNet的主要創新點是用於OCR上。LeNet架構簡單輕巧(就內存占用而言),這使它成為教授CNNs的完美之選。在本章,我們將復制類似於1998年LeCun的論文中的實驗。我們首先回顧LeNet架構,之後使用keras實現網絡,最後將它用在MNIST數據集上評估手寫數字識別。

1 LeNet架構

我們在第12章使用ShallowNet探索了CNN構建塊,現在我們看看現實中第一個完美的架構LeNet,該架構簡單直接但結果很優異。

                                         技術分享圖片

圖14.1 LeNet架構

LeNet+MNIST組合實驗很容易運行在CPU上,類似於“Hello World”實驗。LeNet架構包含CONV=>ACT=>POOL的模式結構:

技術分享圖片

註意,在上述架構中使用Tanh作為激活函數而不是ReLU,是因為在1998年左右更常見的是使用tanh或sigmoid,直到今天,更常見的是使用ReLU代替tanh。我們在後續實驗中將使用ReLu函數。

技術分享圖片

表14.1 LeNet架構總結

表14.1列出了LeNet架構的參數,我們的輸入層為28×28×1,之後學習20個核,每個核5×5大小。卷積層之後跟隨一個POOL層,POOL層計算為核2×2、stride為2×2的max pooling。

架構的下一個塊采取類似結構,這次學習50個5×5的過濾器。隨著實際的空間輸入維度的減少,在網絡的更深層上增加卷積層的數目是很常見的。

之後我們有兩個FC層,第一個FC層包含500個隱藏節點,之後跟著ReLU激活。最後一個FC層控制輸出類別標簽的數目(這個例子中為0-9分別代表一個數字)。最後跟著一個softmax激活層,獲得每個類別的輸出概率。

2 實現LeNet

給定14.1的表,我們使用keras庫實現LeNet架構。我們在chapter12/pyimagesearch/nn/conv下新建一個名為lenet.py的文件,該文件包含實際的LeNet實現。

我們將chapter12/pyimagesearch文件夾拷貝到chapter14/下,然後打開lenet.py文件,開始鍵入LeNet網絡實現,具體見GitHub。

from keras.model import Sequential,這個方法是網絡構建一層一層的構建塊初始化,之後可按照架構藍圖一層一層配置。那麽,第一個conv=>relu=>pool配置如下:

      技術分享圖片

對照程序代碼,以及表14.1,我們按照keras層構建方法,一步步即可構建出最終的LeNet模型。

構建完後,由於我們在後面需要導入該模型,因此需要在nn.conv.__init__.py中添加兩行模塊說明:

from .lenet import LeNet __all__=[‘ShallowNet’, ‘LeNet’]

3 在MNIST上實施LeNet

下一步我們創建一個腳本,用於從磁盤加載MNIST數據集、初始化LeNet架構、訓練LeNet、評估網絡性能。

我們在chapter14/下創建一個名為lenet_mnist.py的文件,然後鍵入代碼,代碼見GitHub。此時我們的python構建腳本將變得比較標準,且具備比較通用框架。在本書的大量例子中,我們將導入:

(1)我們要訓練的網絡架構

(2)一個訓練網絡的優化器(如SGD)

(3)給定訓練集時用於構建和劃分訓練和測試集的合適函數

(4)評估分類器性能的計算分類報告的函數

本書之後幾乎所有例子都遵循這種導入模式,當然也會添加一些輔助函數,如argparse等模塊。

MNIST數據集已經預處理過了,且每個數字圖片為28×28=784維數據,我們要根據是否通道優先來改變排列順序,見代碼。

我們按照網絡藍圖構建了一個特定網絡架構實現之後,我們在訓練腳本中,通過上述步驟加載必要的模塊後。一般的設計腳本步驟為:加載必要模塊、加載數據集、按照模型要求對數據集大小等預處理、按照keras通道優先要求處理數據、劃分數據集、標簽轉為向量形式、初始化優化器和模型、訓練模型、評估網絡、顯示網絡性能曲線。

訓練完成後, 性能曲線如圖所示:

技術分享圖片

可看到使用LeNet後,訓練正確率接近98%,比第10章中的前向網絡的92%的正確率提高了很多。由訓練損失和正確率曲線,可看到在5輪之後,我們的正確率就接近到96%,這說明我們的網絡特性相當好。我們的訓練和驗證損失持續下降,只在部分點上出現跳動,這是由於學習率為常量的緣故,這將在第16章討論。

這個圖表演示了損失和正確率之間很好的性能,沒有過擬合的跡象。這種如此好的訓練圖表,暗示了我們的網絡學習到了潛在的模式而沒有發生過擬合。

MNIST數據集的問題是圖像被過度預處理了而不能代表現實世界中真實的圖像分類問題。研究者傾向於使用MNIST數據集作為基準測試來評估新的分類算法。如果新的方法沒有獲得>95%的分類正確率,那麽存在缺陷要麽是算法本身要麽是算法實現上。

4 總結

本章中,我們實現了經典的LeNet網絡模型,盡管經典,但是它僅實現了4個可訓練層(2個CONV層和2個FC層)。考慮到今天的最新的網絡架構如VGG(16或19層)和ResNet(100+層),LeNet仍然是一個比較淺的網絡(Shallow network)。

下一章,我們將討論VGGNet的變種,作者稱為“MiniVGGNet”。這個架構變種與【2】中的架構原理一模一樣,只是減少了層數允許我們可以在較小的數據集上訓練網絡。對於VGGNet的完全實現,可以見ImageNet Bundle的第6章將從頭在ImageNet上實現。

5 附錄

[1] Yann Lecun et al. “Gradient-based learning applied to document recognition”. In: Proceedings of the IEEE. 1998, pages 2278–2324 (cited on pages 24, 195, 219, 227).

[2] Karen Simonyan and Andrew Zisserman. “Very Deep Convolutional Networks for LargeScale Image Recognition”. In: CoRR abs/1409.1556 (2014). URL: http://arxiv.org/abs/1409.1556 (cited on pages 113, 192, 195, 227, 229, 278).

第14章 LeNet:識別手寫數字