DenseNet論文解讀理解

論文名稱:Densely Connected Convolutional Networks
論文鏈接:https://arxiv.org/pdf/1608.06993.pdf
代碼的github鏈接:https://github.com/liuzhuang13/DenseNet


DenseNet

作者在開頭講述了諸如ResNets、FractalNets、Highway等網絡,並總結了一句話:they
create short paths from early layers to later layers. 意思就是說,像這種很深的網絡,保持梯度不消失,或者減少消失,是通過這種前層和後層直連的方式進行的。所以,作者在本文中提出了這個叫做DenseNet的網絡。

對比ResNets,作者沒有把通過一個層的特徵進行求和,而是通過連接的方式把每一層的特徵連接起來,就像一個list,每經過一層進行一次append。所以當經過l 層時,第l 層有l 個輸入,所以對於一個l 層的網絡,一共有L(L+1)2 個連接。

DenseNet網絡結構圖:
這裏寫圖片描述
這裏寫圖片描述

相較於傳統卷積網絡
1)DenseNet有更少的網絡參數,網絡更窄
2)這種結構更有利於信息的傳遞,以及進行反向傳播的時候,更有利於減輕梯度消失的情況

DenseNet和ResNets兩個網絡最直觀的描述:

ResNets: Xl=Hl(Xl1)+Xl1
DenseNets: Xl=Hl([X0,X1,X2,...,Xl1])

我們可以看出Res是對上一次輸入的數據(上上次Transformation的結果)和其Transformation進行整合,而Dense是對本層之前的每一次輸入進行concatenation,並整體進行Transformation,這樣操作對誤差反向傳播更好找到來源,更好的調整參數。

這裏寫圖片描述

這個Table1就是整個網絡的結構圖。這個表中的k表示每個dense block中每層輸出的feature map個數爲了避免網絡變得很寬,作者都是採用較小的k,比如32這樣,作者的實驗也表明小的k可以有更好的效果。根據dense block的設計,後面幾層可以得到前面所有層的輸入,因此concat後的輸入channel還是比較大的。另外這裏每個dense block的3*3卷積前面都包含了一個1*1的卷積操作,就是所謂的bottleneck layer,目的是減少輸入的feature map數量,既能降維減少計算量,又能融合各個通道的特徵,何樂而不爲。另外作者爲了進一步壓縮參數,在每兩個dense block之間又增加了1*1的卷積操作。因此在後面的實驗對比中,如果你看到DenseNet-C這個網絡,表示增加了這個Translation layer,該層的1*1卷積的輸出channel默認是輸入channel到一半。如果你看到DenseNet-BC這個網絡,表示既有bottleneck layer,又有Translation layer。

再詳細說下bottleneck和transition layer操作。在每個Dense Block中都包含很多個子結構,以DenseNet-169的Dense Block(3)爲例,包含32個1*1和3*3的卷積操作,也就是第32個子結構的輸入是前面31層的輸出結果,每層輸出的channel是32(growth rate),那麼如果不做bottleneck操作,第32層的3*3卷積操作的輸入就是31*32+(上一個Dense Block的輸出channel),近1000了。而加上1*1的卷積,代碼中的1*1卷積的channel是growth rate*4,也就是128,然後再作爲3*3卷積的輸入。相比於1000,這就大大減少了計算量,這就是bottleneck思想。至於transition layer,放在兩個Dense Block中間,是因爲每個Dense Block結束後的輸出channel個數很多,需要用1*1的卷積核來降維。還是以DenseNet-169的Dense Block(3)爲例,雖然第32層的3*3卷積輸出channel只有32個(growth rate),但是緊接着還會像前面幾層一樣有通道的concat操作,即將第32層的輸出和第32層的輸入做concat,前面說過第32層的輸入是1000左右的channel,所以最後每個Dense Block的輸出也是1000多的channel。因此這個transition layer有個參數reduction(範圍是0到1),表示將這些輸出縮小到原來的多少倍,默認是0.5,這樣傳給下一個Dense Block的時候channel數量就會減少一半,這就是transition layer的作用。文中還用到dropout操作來隨機減少分支,避免過擬合,畢竟這篇文章的連接確實多。

作者在4個數據集上進行實驗:CIFAR-10、CIFAR-100、SVHN和ImageNet

這裏寫圖片描述

Table2是在三個數據集(C10,C100,SVHN)上和其他算法的對比結果。DenseNet-BC的網絡參數和相同深度的DenseNet相比確實減少了很多!參數減少除了可以節省內存,還能減少過擬合。這裏對於SVHN數據集,DenseNet-BC的結果並沒有DenseNet(k=24)的效果好,作者認爲原因主要是SVHN這個數據集相對簡單,更深的模型容易過擬合。在表格的倒數第二個區域的三個不同深度L和k的DenseNet的對比可以看出隨着L和k的增加,模型的效果是更好的。

這裏寫圖片描述
Figure3是DenseNet-BC和ResNet在Imagenet數據集上的對比,左邊那個圖是參數複雜度和錯誤率的對比,你可以在相同錯誤率下看參數複雜度,也可以在相同參數複雜度下看錯誤率,提升還是很明顯的!右邊是flops(可以理解爲計算複雜度)和錯誤率的對比,同樣有效果。
這裏寫圖片描述
Figure4也很重要。左邊的圖表示不同類型DenseNet的參數和error對比。中間的圖表示DenseNet-BC和ResNet在參數和error的對比,相同error下,DenseNet-BC的參數複雜度要小很多。右邊的圖也是表達DenseNet-BC-100只需要很少的參數就能達到和ResNet-1001相同的結果。

該文章提出的DenseNet核心思想在於建立了不同層之間的連接關係,充分利用了feature,進一步減輕了梯度消失問題,加深網絡不是問題,而且訓練效果非常好。另外,利用bottleneck layer,Translation layer以及較小的growth rate使得網絡變窄,參數減少,有效抑制了過擬合,同時計算量也減少了。DenseNet優點很多,而且在和ResNet的對比中優勢還是非常明顯的。

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