Pytorch CIFAR-10分類(DenseNet)

4.定義網絡(DenseNet)

前面ResNet通過前層與後層的“短路連接”(Shortcuts),加強了前後層之間的信息流通,在一定程度上緩解了梯度消失現象,從而可以將神經網絡搭建得很深。更進一步,DenseNet最大化了這種前後層信息交流,通過建立前面所有層與後面層的密集連接,實現了特徵在通道維度上的複用,使其可以在參數與計算量更少的情況下實現比ResNet更優的性能。

DenseNet的網絡架構如下圖所示,網絡由多個Dense Block與中間的卷積池化組成,核心就在Dense Block中。Dense Block中的黑點代表一個卷積層,其中的多條黑線代表數據的流動,每一層的輸入由前面的所有卷積層的輸出組成。注意這裏使用了通道拼接(Concatnate)操作,而非ResNet的逐元素相加操作。

結構

具體的Block實現細節如下圖所示,每一個Block由若干個Bottleneck的卷積層組成,對應上面圖中的黑點。Bottleneck由BN、ReLU、1×1卷積、BN、ReLU、3×3卷積的順序構成,也被稱爲DenseNet-B結構。其中1x1 Conv得到 4k 個特徵圖它起到的作用是降低特徵數量,從而提升計算效率。

DenseNet的Block結構

關於Block,有以下4個細節需要注意:

1.每一個Bottleneck輸出的特徵通道數是相同的,例如這裏的32。同時可以看到,經過Concatnate操作後的通道數是按32的增長量增加的,因此這個32也被稱爲GrowthRate。

2.這裏1×1卷積的作用是固定輸出通道數,達到降維的作用。當幾十個Bottleneck相連接時,Concatnate後的通道數會增加到上千,如果不增加1×1的卷積來降維,後續3×3卷積所需的參數量會急劇增加。1×1卷積的通道數通常是GrowthRate的4倍。

3.上圖中的特徵傳遞方式是直接將前面所有層的特徵Concatnate後傳到下一層,這種方式與具體代碼實現的方式是一致的。

  1. Block採用了激活函數在前、卷積層在後的順序,這與一般的網絡上是不同的。

DenseNet的結構有如下兩個特性:

1.神經網絡一般需要使用池化等操作縮小特徵圖尺寸來提取語義特徵,而Dense Block需要保持每一個Block內的特徵圖尺寸一致來直接進行Concatnate操作,因此DenseNet被分成了多個Block。Block的數量一般爲4。
2.兩個相鄰的Dense Block之間的部分被稱爲Transition層,對於Transition層,它主要是連接兩個相鄰的DenseBlock,並且降低特徵圖大小。具體包括BN、ReLU、1×1卷積(Conv)、2×2平均池化操作。1×1卷積的作用是降維,起到壓縮模型的作用,而平均池化則是降低特徵圖的尺寸。

3.Transition層可以起到壓縮模型的作用。假定Transition的上接DenseBlock得到的特徵圖channels數爲m ,Transition層可以產生θm個特徵(通過卷積層),其中0 <θ≤1是壓縮係數(compression rate)。當 θ=1時,特徵個數經過Transition層沒有變化,即無壓縮,而當壓縮係數小於1時,這種結構稱爲DenseNet-C,原論文中使用θ≤0.5 。對於使用bottleneck層的DenseBlock結構和壓縮係數小於1的Transition組合結構稱爲DenseNet-BC。

數據集的不同

DenseNet共在三個圖像分類數據集(CIFAR,SVHN和ImageNet)上進行測試。對於CIFAR,SVHN兩個數據集,其輸入圖片大小爲 32x32,所使用的DenseNet在進入第一個DenseBlock之前,首先進行進行一次3x3卷積(stride=1),每個DenseBlock裏面的層數相同。最後的DenseBlock之後是一個global AvgPooling層,然後送入一個softmax分類器。注意,在DenseNet中,所有的3x3卷積均採用padding=1的方式以保證特徵圖大小維持不變。

CIFAR,SVHN結構

注意:這是我根絕自己的理解畫的圖(原文中沒有),如有錯誤還望指正

對於ImageNet數據集,圖片輸入大小爲224x224,網絡結構採用包含4個DenseBlock的DenseNet-BC,其首先是一個stride=2的7x7卷積層,然後是一個stride=2的3x3 MaxPooling層,後面才進入DenseBlock。

ImageNet數據集

這個放心,這是原文中的圖

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章