1. 程式人生 > >第20章 keras中“開箱即用”CNNs

第20章 keras中“開箱即用”CNNs

當我 put 最新 size 興趣 討論 小數 lob 序列化

第20章 keras中“開箱即用”CNNs

到目前為止,我們學習了如何從頭開始訓練CNNs。這些CNNs大多數工作在淺層(以及較小數據集上),以至於它們可以很容易的在CPU上訓練,而不需要在更貴的GPU上,這使得我們能夠掌握神經網絡和深度學習的基礎。

但是由於我們只在淺層網絡上工作,我們無法利用深度學習帶給我們的全分類能力。幸運的是,keras庫預置了5種在ImageNet數據集上預訓練的CNNs:

l VGG16

l VGG19

l ResNet50

l Inception V3

l Xception

就像第5章討論的,ILSVRC的目標是訓練一個可以將圖片正確的分類到1000種不同對象類別的模型。這1000種圖像分類表示了我們日常見到的常見分類,如狗、貓、不同車輛等等類型。

這意味著如果我們利用在ImageNet數據集上預訓練的CNNs,我們可以“開箱即用”(out-of-the-box)的識別出所有這些1000種類別,而不需要重新訓練。

本章,我們將回顧內置在keras庫中的預訓練的最新的ImageNet模型。之後,將演示如何寫python腳本利用這些網絡來分類我們自定義的圖像,而不需要從頭訓練這些模型。

1 Keras中最新的CNNs

此時,你可能想:“我沒有貴重的GPU。我怎麽利用這些大的深度學習模型呢?因為它們在數據集上預訓練要比本書中我們做的要大得多?”

要回答這個問題,回到第8章的參數化學習,回顧參數化學習的兩個要點:

(1)定義一個機器學習模型,它可以在訓練時間內從輸入數據中學習模式(需要我們花費大量時間在訓練過程中),但是在測試過程中將快速的多;

(2)獲得一個可以用少量參數定義的模型,這些參數可以很容易的表示網絡,而不管訓練集大小。

因此,我們實際的模型尺寸是參數的函數,而不是訓練數據的量。我們可以在1億張圖片或1000張圖片的數據集上訓練訓練一個很深的CNN(如VGG或ResNet),但是我們的輸出模型尺寸是相同的,因為模型尺寸是由我們選擇的架構決定的。

其次,神經網絡占據了大部分時間,我們將花費大量時間來訓練CNNs,不管這是由於架構很深、訓練數據量很大、還是由於調參而大量實驗造成的。

優化的硬件如GPUs可以加速我們在BP算法中前向和後向都需要計算的訓練過程,我們知道這個過程實際上是我們的網絡學習的過程。但是,一旦我們的訓練完成後,我們只需要執行前向過程來分類一張給定的輸入圖像。前向過程實際上是非常快的,這使我們可以在CPUs上使用深度神經網絡來分類給定圖片。

在大多數情況下,本章的網絡架構在CPU上將不會獲得真正的實時性能(那樣我們需要GPU),但也是可以的,我們仍可以將它們用在自定義的應用上。如果你對如何從頭在ImageNet數據集上訓練最新的CNNs感興趣,那麽看作者在ImageNet Bundle中的精確的示例。

1.1 VGG16和VGG19

技術分享圖片

圖20.1 VGG架構可視化

VGG網絡架構在2014年論文《Very Deep Convolutional Networks for Large Scale Image Recognition》中介紹,見圖20.1。就像我們在第15章討論的,VGG家族的網絡的特點是,僅使用3×3的卷積層隨著深度增加堆疊在一起。通過max pooling處理降低卷大小。每個都為1096的兩個FC層之後跟著一個softmax層。

在2014年,16和19層的神經網絡認為是很深的,盡管現在ResNet架構可以在ImageNet上成功的訓練在50-100層以及在CIFAR-10上訓練到1000層。不幸的是,VGG有兩個缺陷:

(1)訓練極其慢(幸運的是本章我們只需要測試輸入圖像);

(2)網絡權重本身相當大。由於深度和FC節點的數目,VGG16序列化的權重文件是533MB而VGG19是574MB。

幸運的是,這些權重只需要下載一次,之後就可以從磁盤上加載它們。

1.2 ResNet

ResNet第一次在2015年論文《Deep Residual Learning for Image Recognition》中介紹,該架構就稱為深度學習文獻的開創性工作,證明了通過使用殘差模塊(residual modules)就可以通過使用標準的SGD(和一個合理的初始化函數)來訓練很深的網絡。

技術分享圖片

圖20.2 左:原始殘差模塊 右:使用預激活的殘差模塊

通過使用身份映射(identity mappings)(見圖20.2)來更新殘差模塊可以進一步提高正確率,這在2016年的文章《Identity Mappings in Deep Residual Networks》被證明。

也就是說,註意在keras核心庫中實現的ResNet50(也就是50個權重層)是以2015年的論文為基礎。盡管ResNet比VGG16和VGG19深的多,但是由於使用了global average pooling而不是FC層,它的權重尺寸是相當小的,即對於ResNet50的模型尺寸減小到了102MB。

如果你對ResNet架構的學習感興趣,包括殘差模塊和它是如何工作的,去看更詳細的Practitioner Bundle和ImageNet Bundle。

1.3 Inception V3

                                        技術分享圖片

圖20.3 在GoogLeNet中使用的原始Inception模塊

這個“Inception”模塊(導致了Inception架構)在2014年的文章《Going Deeper with Convolutions》介紹。Inception模塊(見圖20.3)的目標是扮演“多級特征提取器”,通過在網絡的相同模塊上計算1×1、3×3和5×5的卷積,這些過濾器的輸出在進入網絡的下一層之前沿著通道維度堆疊在一起。

這個架構的原始化身稱為GoogLeNet,但是隨後出現的現象簡單的將它命名為Inception vN,這裏的N是由Google指出的版本號。包含在keras核中的Inception V3架構來自之後出版的《Rethinking the Inception Architecture for Computer Vision》,他對Inception模塊提出更新來進一步提升ImageNet的分類正確率。Inception V3的權重比VGG和ResNet都要小,達到了96MB。

對於Inception模塊工作的更多信息(以及如何從頭訓練GoogLeNet),見Practitioner Bundle ImageNet Bundle

1.4 Xception

正是keras庫的創建者和主要維護者Fran?ois Chollet本人在2016年的文章《Xception: Deep Learning with Depthwise Separable Convolutions》中提出了Xception。Xception是Inception架構的延伸,它使用深度可分離卷積(depthwise separable convolutions)替代了標準的Inception模塊。這個Xception權重是包含在keras庫中預訓練的網絡中最小的,權重只有91MB。

1.5 還有更小的架構嗎?

技術分享圖片

圖20.5 SqueezeNet中的“fire”模塊。

盡管沒有包含在keras庫中,我還要提到的一種當我們需要小卷積核時經常使用的SqueezeNet架構,見文章《SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <1MB model size》,如圖20.5所示,包含一個“squeeze”和一個“expand”。SqueezeNet非常小只有4.9MB且經常用在當需要對網絡進行訓練,然後將其部署到網絡和/或資源受限的設備時。

再次說明,盡管SqueezeNet沒有包含在keras核心中,但是我將在ImageNet Bundle中在ImageNet數據集上從頭演示如何訓練它。

2 使用預訓練的ImageNet CNNs分類圖像

讓我們學習如何使用keras庫在預訓練的CNNs上分類圖像。我們不會更新到目前為止我們已經開發的pyimagesearch模塊,因為預訓練的模型是keras庫的一部分。

僅僅打開文件命名為imagenet_pretrained.py,鍵入代碼即可,見GitHub的chapter20/下。

訓練模型時,通過python imagenet_pretrained.py --image example_images/test01.jpg --model vgg16即可。

3 總結

本章回顧了keras庫自帶的5中預訓練模型:VGG16、VGG19、ResNet50、Inception V3、Xception。

但是,對於想要在大數據集上訓練深度網絡更高級技術的學習,建議瀏覽Practitioner Bundle。如果對如何從頭訓練這些模型感興趣,見ImageNet Bundle。

第20章 keras中“開箱即用”CNNs