2017CS231n李飛飛深度視覺識別筆記(九)——CNN架構
第九講 CNN架構
上一章中討論了不同的深度學習框架,包括有TensorFlow、PyTorch、Caffe,這一章中將會討論CNN架構方面的內容。
在這裡會深入探討那些ImageNet比賽獲勝者所用的最多的神經網路架構,比如AlexNet、VGG、GoogleNet和ResNet。
(1)LeNet
它可以看作是通訊網路的第一個例項,並在實際應用中取得成功,使用步長為1、大小為5*5的卷積核來對第一層進行輸入,並且同樣的卷積層和池化層有好幾層以及在網路的最後有一些全連線層,它在數字識別領域方面的應用去得到了成功。
(2)AlexNet
它是第一個在ImageNet的分類比賽中獲得成功的大型卷積神經網路,同樣也是第一個基於深度學習的網路結構;它的基礎架構是卷積層、池化層、歸一化層的混合,最後是一個全連線層。
它的輸入是227*227*3的影象矩陣,步長為4,大小為11*11的卷積核有96個,算出第一個卷積層的輸出資料體積為:(227-11)/4+1=55,那麼最後輸出的空間維度是55*55*96;輸出的引數為11*11*3*96=35K。
這個架構中第一次使用了ReLU非線性函式;使用本地相應歸一化層,通過相鄰通道來歸一化響應,但是這並不太有效果,因為它增加了大量的資料;為了得到更好的效果,還使用了模型整合訓練多個模型對它們取平均從而獲得性能上的提升。
(3)VGGNet
VGG的思想是一個非常深的網路,包含非常小的卷積核,它從AlexNet的8層擴充套件到了16~19層,關鍵是它使用很小的卷積核,只用3*3的卷積核。
問題:為什麼使用小的卷積核?
答:當使用小的卷積核可以得到比較小的引數量,然後可以利用堆疊更多的引數不使用大的卷積核,這樣可以嘗試而更多的網路和卷積,最終的效果比用7*7的卷積核有效接收範圍更好些。
問題:3*3的卷積核步長1的有效接收範圍是什麼?
答:輸入的全部空間區域,保證了3層網路的頂層。
(4)GoogleNet
GoogleNet是一個更深的網路結構,它有22層,它嘗試設計一個網路結構可以進行高效計算,採用了inception模組,然後簡單在每一層的頂部搭這個模組,網路中沒有全連線層,節省了大量引數,比AlexNet少了12倍。
那麼什麼是inception模組呢?
Inception模組中隱含的思想是想要設計一個好的區域性網路拓撲,有了拓撲的想法就可以把它視為一個網路,然後堆放大量區域性拓撲在每一層的頂部;在區域性網路中呼叫inception模組要做的是對進入相同層的相同輸入並行應用不同的濾波操作,來自前面一層的輸入然後進行不同的卷積和池化操作,這樣就可以在不同的層得到不同的輸出,這些層將所有的濾波器輸出並在深度層上串聯起來,然後在最後得到一個張量輸出。
案例:
這裡輸入的Inception模組是28*28*256,經過不同的卷積核處理後得到的輸出為28*28*672,保留了相同的尺寸擴充了深度。
為了減少計算量,在其中可以嘗試新增一層瓶頸層(1*1的卷積層)幫助降低計算量,GoogleNet做的就是初始化這些模組,然後將它們放入堆疊中。
GoogleNet有22層,同時它有一個高效的Inception模組,沒有全連線層,引數向量只有AlexNet的1/12。
(5)ResNet
ResNet這個想法是深度網路的一次革命,它比之前提到的所有神經網路架構都要深,有152層,也叫做殘差網路。
當在普通卷積神經網路上堆疊越來越多的層時,會發生什麼?僅僅是通過持續擴充套件就能得到更深的層以及取得更好的效果嗎?
答:顯然不是,模型雖然更深卻也會變現的更差,如下圖的比較所示。
所以解決方法是不僅僅堆疊這些層而是讓每層都嘗試學習一些所需函式的底層對映,殘差塊的輸入只是傳輸進來的輸入,使用這些塊嘗試並擬合殘差對映而不是直接對映;與其直接學習H(x),需要在輸入上加上或減去什麼,F(x)=H(x)-x,F(x)就是所說的殘差。
下面是上述幾種網路架構的訓練效果圖:
很明顯ResNet是最近一段時間來表現最好的模型,如果想尋找某種演算法 訓練一個新的神經網路模型最好嘗試使用ResNet。
(6)其他的架構
NiN是神經網路研究領域的第一個網路模型,它在2014年是GoogleNet和ResNet模型的先驅,瓶頸層的這個概念是從這裡開始的。
ResNet的改進:
通過改進ResNet的模型設計,調整了ResNet塊路徑中的層,並且這個新的結構能夠實現一種更直接的路徑以便於在整個資訊網路中傳播,然後就可以得到能夠實現整個網路傳播的路徑,並且能再次反向傳播回去,這樣模型可以提供更好的效能。
雖然ResNet使網路層數變得更深,也增加了這些殘差網路的連線,另一種想法是殘差量是是一個十分重要的影響因素,存在這種殘差結構並不一定代表這個網路層數就很多,所以使用更寬的殘差模組,這就意味著轉換成有更多的卷積核,結果表明使用更寬的殘差模組僅使用50層的寬殘差網路,它的表現就能優於ResNet原來的152層網路。
ResNeXt這是另一種改進結構,為了解決寬度問題,但它並不是通過增加架構中的卷積核來增加殘差模組的寬度,而是在每個殘差模組內建立多分支,這樣也可以達到寬網路的效果同時與Inception模組也有些相似,運動了一些平行運算對各層進行並行運算。
另一種改善ResNet的思路是運用隨機深度的思想,當網路越來越深,往往會碰到梯度消失的問題;因此,最初的想法是在訓練時讓網路變得更“淺”,會隨機拋棄一組子層集,對於一個子層集會拋棄其權重,只把它們作為恆等連線,現在網路更淺了就可以更好地進行反向傳播。這就是一種隨機拋棄法。
這裡有一種叫FractaNet的網路結構,它的觀點是引入殘差並不是必須的,關鍵在於有效的從淺網路轉型為深層網路;因此,使用了一種分形結構:
同時存在淺層和深層路徑到達輸出值,這裡不同的路徑通過拋棄子路徑的方式來訓練具有了dropout的特色。
DenseNet即密集連線卷積網路是另一具有特色的網路結構,它使用稱為密集塊,每個塊中每層都與其後所有層連線,以前饋的形式連線,因此,在這一區塊內,對區塊的輸入也是對其他所有其他各卷積層的輸入,會計算出每個卷積層的輸出值,然後這些值集中共同作為下一個卷積層的輸入;這一方法能夠緩解梯度消失的問題。
如何讓網路高效的執行非常重要,在最近提出的網路結構SqueezeNet中,它關注的是高效網路,它由一個個fire模組組成,每個模組有一個Squeeze層(擠壓層)和許多1*1的卷積核,接著再傳遞給一個擴大層;利用這樣的網路結構可以達到AlexNet水平的準確率,但引數只需1/50,網路也可以繼續壓縮為1/500,所以一個未來的方向:如何有效壓縮網路大小。
總結:
這一章中主要講了4個主要的網路架構,同時也瞭解了其他的一些網路模型,所以對這些網路結構可以多去了解一下,細看論文的講解內容。