1. 程式人生 > >10 大深度學習架構:計算機視覺優秀從業者必備(附程式碼實現)

10 大深度學習架構:計算機視覺優秀從業者必備(附程式碼實現)

近日,Faizan Shaikh 在 Analytics Vidhya 發表了一篇題為《10 Advanced Deep Learning Architectures Data Scientists Should Know!》的文章,總結了計算機視覺領域已經成效卓著的 10 個深度學習架構,並附上了每篇論文的地址連結和程式碼實現。機器之心對該文進行了編譯,原文連結請見文末。

時刻跟上深度學習領域的最新進展變的越來越難,幾乎每一天都有創新或新應用。但是,大多數進展隱藏在大量發表的 ArXiv / Springer 研究論文中。

為了時刻了解最新動態,我們建立了一個閱讀小組,在 Analytics Vidhya 內部分享學習成果。我想和大家分享的是一項關於研究社群開發出的高階架構的調查。

本文包括深度學習領域的最新進展、keras 庫中的程式碼實現以及論文連結。為保證文章簡明,我只總結了計算機視覺領域的成功架構。

什麼是高階架構?

相比於單一的傳統機器學習演算法,深度學習演算法由多樣化的模型組成;這是由於神經網路在構建一個完整的端到端的模型時所提供的靈活性。

神經網路有時可比作樂高塊,藉助想象力你幾乎可以用它建構從簡單到複雜的任何結構。

我們可以把高階架構定義為一個具有良好記錄的成功模型;這主要見於挑戰賽中,比如 ImageNet,其中你的任務是藉助給定的資料解決影象識別等問題。

正如下文所描述的每一個架構,其中每一個都與常見的模型有細微不同,在解決問題時這成了一種優勢。這些架構同樣屬於「深度」模型的範疇,因此有可能比淺層模型表現更好。

計算機視覺任務的型別

本文主要聚焦於計算機視覺,因此很自然地描述了計算機視覺任務的分類。顧名思義,計算機視覺即通過建立人工模型來模擬本由人類執行的視覺任務。其本質是人類的感知與觀察是一個過程,它可在人工系統中被理解和實現。

計算機視覺任務的主要型別如下:

  • 物體識別/分類:在物體識別中,給出一張原始影象,你的任務是識別出該影象屬於哪個類別。

  • 分類+定位:如果影象中只有一個物體,你的任務是找到該物體在影象中的位置,一個更專業的稱謂是定位。

  • 物體檢測:在物體檢測中,你的任務是找到影象中多個物體的各自位置。這些物體可能屬於同一類別,或者各自不同。

  • 影象分割:影象分割是一個稍微複雜的任務,其目標是將每一個畫素對映到正確的分類。

深度學習架構清單

現在我們明白了什麼是高階架構,並探討了計算機視覺的任務分類,現在讓我們列舉並描述一下最重要的深度學習架構吧。

1. AlexNet

AlexNet 是首個深度架構,它由深度學習先驅 Geoffrey Hinton 及其同僚共同引入。AlexNet 是一個簡單卻功能強大的網路架構,為深度學習的開創性研究鋪平了道路。下圖是論文作者提出架構的示圖。

如圖所示,分解後的 AlexNet 像是一個簡單的架構,卷積層和池化層層疊加,最上層是全連線層。這是一個非常簡單的架構,其早在 80 年代就已被概念化。但是該模型的突出特徵是其執行任務的規模與使用 GPU 進行訓練。20 世紀 80 年代,訓練神經網路使用的是 CPU,而 AlexNet 藉助 GPU 將訓練提速了 10x。

論文:ImageNet Classification with Deep Convolutional Neural Networks

  • 連結:https://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

  • 程式碼實現:https://gist.github.com/JBed/c2fb3ce8ed299f197eff

2. VGG Net

VGG 網路由牛津視覺化圖形組(Visual Graphics Group)開發,因此其名稱為 VGG。該網路的特點是金字塔形,與影象最近的底層比較寬,而頂層很深。

如上圖所示,VGG 包含池化層之後的卷積層,池化層負責使層變窄。他們在論文中提出多個此類網路,不同之處在於架構深度的變化。

VGG 的優勢:

  • 適合在特定任務上進行基準測試。

  • VGG 的預訓練網路可在網際網路上免費獲取,因此被廣泛用於各種應用。

另一方面,它的主要缺陷在於如果從頭訓練,則過程緩慢。即使在效能很好的 GPU 上,也需要一週多的時間才能完成訓練。

論文:Very Deep Convolutional Networks for Large-Scale Image Recognition

  • 連結:https://arxiv.org/abs/1409.1556

  • 程式碼實現:https://github.com/fchollet/keras/blob/master/keras/applications/vgg16.py

3. GoogleNet

GoogleNet(或 Inception 網路)是谷歌研究者設計的一種架構。GoogleNet 是 ImageNet 2014 的冠軍,是當時最強大的模型。

該架構中,隨著深度增加(它包含 22 層,而 VGG 只有 19 層),研究者還開發了一種叫作「Inception 模組」的新型方法。

如上圖所示,它與我們之前看到的序列架構發生了很大改變。單個層中出現了多種「特徵抽取器(feature extractor)」。這間接地改善了該網路的效能,因為該網路在訓練過程中有多個選項可以選擇,來解決該任務。它可以選擇與輸入進行卷積,也可以直接將其池化。

最終架構包括堆疊在一起的多個 inception 模組。GoogleNet 的訓練過程也有稍許不同,即最上層有自己的輸出層。這一細微差別幫助模型更快地進行卷積,因為模型記憶體在聯合訓練和層本身的並行訓練。

GoogleNet 的優勢在於:

  • GoogleNet 訓練速度比 VGG 快。

  • 預訓練 GoogleNet 的規模比 VGG 小。VGG 模型大於 500 MB,而 GoogleNet 的大小隻有 96MB。

GoogleNet 本身沒有短期劣勢,但是該架構的進一步改變使模型效能更佳。其中一個變化是 Xception 網路,它增加了 inception 模組的發散極限(我們可以從上圖中看到 GoogleNet 中有 4 個 inception 模組)。現在從理論上講,該架構是無限的(因此又叫極限 inception!)。

論文:Rethinking the Inception Architecture for Computer Vision

  • 連結:https://arxiv.org/abs/1512.00567

  • 程式碼實現:https://github.com/fchollet/keras/blob/master/keras/applications/inception_v3.py

4.ResNet

ResNet 是一個妖怪般的架構,讓我們看到了深度學習架構能夠有多深。殘差網路(ResNet)包含多個後續殘差模組,是建立 ResNet 架構的基礎。下圖是殘差模組的表示圖:

簡言之,一個殘差模組有兩個選擇:完成輸入端的一系列函式,或者跳過此步驟。

類似於 GoogleNet,這些殘差模組一個接一個地堆疊,組成了完整的端到端網路。

ResNet 引入的新技術有:

  • 使用標準的 SGD,而非適應性學習技術。它聯通一個合理的初始化函式(保持訓練的完整性)做到的這一點。

  • 輸入預處理的變化,輸入首先被區分到影象塊中,然後輸送到網路中。

ResNet 主要的優勢是數百,甚至數千的殘差層都能被用於創造一個新網路,然後訓練。這不同於平常的序列網路,增加層數量時表現會下降。

論文:Deep Residual Learning for Image Recognition

  • 連結:https://arxiv.org/abs/1512.03385

  • 程式碼實現:https://github.com/fchollet/keras/blob/master/keras/applications/resnet50.py

5. ResNeXt

ResNeXt 據說是解決目標識別問題的最先進技術。它建立在 inception 和 resnet 的概念上,並帶來改進的新架構。下圖是對 ResNeXt 模組中的殘差模組的總結。

圖 1. 左:ResNet 塊。右:基數=32 的 ResNeXt 塊,複雜度大致相同。層顯示為(# in channels, filter size, # out channels)。

論文:Aggregated Residual Transformations for Deep Neural Networks

  • 連結:https://arxiv.org/pdf/1611.05431.pdf

  • 程式碼實現:https://github.com/titu1994/Keras-ResNeXt

6. RCNN (基於區域的 CNN)

基於區域的 CNN 架構據說是所有深度學習架構中對目標檢測問題最有影響力的架構。為了解決檢測問題,RCNN 嘗試在影象中所有物體上畫出邊界框,然後識別影象中的物體。工作原理如下:

RCNN 結構如下:

論文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks

  • 連結:https://arxiv.org/abs/1506.01497

  • 程式碼實現:https://github.com/yhenon/keras-frcnn

7. YOLO (You Only Look once)

YOLO 是當前深度學習領域解決影象檢測問題最先進的實時系統。如下圖所示,YOLO 首先將影象劃分為規定的邊界框,然後對所有邊界框並行執行識別演算法,來確定物體所屬的類別。確定類別之後,yolo 繼續智慧地合併這些邊界框,在物體周圍形成最優邊界框。

這些步驟全部並行進行,因此 YOLO 能夠實現實時執行,並且每秒處理多達 40 張影象。

儘管相比於 RCNN 它的表現有所降低,但在日常實時的問題中它還是有優勢的。下圖是 YOLO 架構的示圖:

論文:You Only Look Once: Unified, Real-Time Object Detection

  • 連結:https://pjreddie.com/media/files/papers/yolo.pdf

  • 程式碼實現:https://github.com/allanzelener/YAD2K

8.SqueezeNet

SqueeNet 架構是在移動平臺這樣的低寬頻場景中極其強大的一種架構。這種架構只佔用 4.9 MB 的空間,而 Inception 架構大小為 100MB。這種巨大的差距由一種名為 Fire Module 的特殊結構引起。下圖是 Fire Module 的表示圖:

SqueezeNet 的完整架構如下:

論文:SQUEEZENET: ALEXNET-LEVEL ACCURACY WITH 50X FEWER PARAMETERS AND <0.5MB MODEL SIZE

  • 連結:https://arxiv.org/abs/1602.07360

  • 程式碼實現:https://github.com/rcmalli/keras-squeezenet

9.SegNet 

SegNet 是一個用於解決影象分割問題的深度學習架構。它包含處理層(編碼器)序列,之後是對應的解碼器序列,用於分類畫素。下圖是 SegNet 解析圖:

SegNet 的一個主要特徵是在編碼器網路的池化指標與解碼器網路的池化指標連線時,分割影象保留高頻細節。簡言之,直接進行資訊遷移,而非卷積它們。在處理影象分割問題時,SgeNet 是最好的模型之一。

論文:SegNet: A Deep Convolutional Encoder-Decoder Architecture for Image Segmentation

  • 連結:https://arxiv.org/abs/1511.00561

  • 程式碼實現:https://github.com/imlab-uiip/keras-segnet

10.GAN

GAN 是神經網路架構中完全不同的類別。GAN 中,一種神經網路用於生成全新的、訓練集中未曾有過的影象,但卻足夠真實。例如,以下是 GAN 工作原理的解析圖。

論文:Generative Adversarial Networks

  • 連結:https://arxiv.org/abs/1406.2661

  • 程式碼實現:https://github.com/bstriner/keras-adversarial

原文地址:https://www.analyticsvidhya.com/blog/2017/08/10-advanced-deep-learning-architectures-data-scientists/