發表載體:CVPR,2017,最佳論文
作者信息:Gao Huang,Cornell University; Zhuang Liu, Tsinghua University ;Laurens van der Maaten, Facebook AI Research
論文地址:論文下載
代碼:代碼
1、解決的問題
深度卷積神經網絡可以準確有效地解決各類問題,但是隨着網絡層數的加深,梯度消散的問題愈加嚴重;而且大規模的網絡參數造成了計算量和內存的嚴重負荷;數據流通不夠充分,靠近輸出的網絡層沒有利用到前面的特徵。
2、DenseNet網絡結構及特點
2.1DenseNet設計思路
DenseNet的提出源於ECCV上一篇隨機深度網絡(Deep network with stochastic depth)的文章,該文章採用Dropout來改進ResNet。通過在訓練過程中隨機的丟棄(Dropout)一些網絡層,可以顯著提高網絡的泛化能力。
ResNet比傳統的網絡多了shorcut支路和bottleneck結構(1*1*n conv)。
ResNet是直接求和,用公式表示爲:
思路1::網絡中某一層可以不僅僅依賴於緊鄰上一層的特徵,而可以依賴於更前面層學習到的特徵。例如,在一個深度網絡中,如果第l層被dropout(丟棄),那麼第l+1層就被直接連到了第l-1層;如果第2層--第l層被丟棄,那麼第l+1層就被直接連到了第1層。
思路2:在訓練過程中,隨機丟棄一些網絡層並沒有破壞網絡的收斂性,說明ResNet具有比較明顯的冗餘性。所以,我們將訓練好的ResNet隨機去掉幾層,對網絡的預測結果也不會產生很大的影響。
設計理念:網絡中每一層都與前面層相連接,實現特徵的重複使用;同時把網絡的每一層都設計的特別窄,每一層都只學習到非常少的特徵,達到降低網絡冗餘。
DenseNet是進行拼接,用公式表示爲:
2.2DenseNet網絡結構
DenseNet的網絡結構主要包括DenseBlocks和Transition Layers兩個部分組成。其中,DenseBlocks的結構圖如圖3所示,Transition Layers是連接兩個DenseBlocks的部分,由卷積層和池化層組成(BN-Conv(1*1)-average Pooling(2*2))。
圖4中,DenseBlock有5層,每層進行BN-Relu-Conv(3*3)的操作,每層輸出的通道數爲4(特徵圖的維度是4)。
在DenseBlock中所有層接受前層輸出作爲額外輸入,並將本層的特徵圖作爲後層的輸入。假設一個L層的DenseNet,直接連接有L*(L+1)/2個,如上述5層的DenseNet,具有直接連接5*6/2=15個。
因爲Transition Layers中包含的pooling會改變特徵圖的大小,而DenseBlocks內部某一層的輸入是其所有先前層的輸出,所以,在DenseBlocks內部的特徵圖大小是不變的,否則內部各層之間不能進行連接。
2.3DenseNet的特點
在前向傳播過程中,深層網絡可以獲得淺層網絡提取的特徵信息;在反向傳播過程中,淺層網絡可以獲得深層網絡的梯度信息,促進了數據在網絡各層間的流動(數據充分使用)。
有效緩解了梯度消散問題:如圖4中,H4層可以直接用到原始輸入信息X0,同時還用到了之前層對X0處理後的信息,這樣能夠最大化信息的流動。 反向傳播過程中,X0的梯度信息包含了損失函數直接對X0的導數,減輕了梯度消散。
密集連接,讓網絡中的每一層都與其前面的每一層相連,實現特徵重用,所以,使用較少的卷積核就可以得到大量的特徵圖,網絡參數和計算量少。
3.DenseNet參數減少策略
3.1 Bottleneck layers(瓶頸層)
在DenseNet中,第l層會與前面l-1個網絡層直接連接,假設增長率(Growth rate)爲k,那麼第l層的輸入爲k0+k*(l-1),k0是輸入層的維數。因此,Dense Block中的每一層的輸入隨着網絡層數的增加,後面每層輸入的維數是很大的。
爲了解決這個問題,在Dense Block模塊中,加入了Bottleneck單元,即利用1*1*n的卷積操作對特徵圖進行降維,並設定n=4*k,使得每一層輸出特徵圖的維數是4k,k是增長率。
BN-Relu-Conv(3*3)改進爲BN-Relu-Conv(1*1)-BN-Relu-Conv(3*3).
文中將帶有Bottleneck layers的網絡稱爲DenseNet-B。
3.2 Compression(壓縮)
假設一個L層的Dense Block模塊,已經通過Bottleneck 單元進行了降維操作,即模塊中每一層輸出的維數是4k,那麼該模塊輸出的維數爲4k*L,隨着L層數的增加,該模塊輸出特徵圖的維數也是非常大的。
爲了解決這個問題,該文章在Dense Block模塊之外的過渡層(transition layers)進行降維操作,使得過渡層輸出特徵圖維數爲,其中(0.5)。
文中將帶有Compression的網絡稱爲DenseNet-C;Bottleneck layers和Compression均使用的網絡稱爲DenseNet-BC。
3.3參數計算過程(1*1*4k conv)
某層輸出通道數由該層卷積核的個數決定;
參數:上一通道數*該層卷積核的大小*該層卷積核的通道數。
網絡結構改進:在3*3*128的卷積之前加上1*1*96的卷積;
在5*5*32的卷積之前加上1*1*16的卷積;
在max pooling之後加上1*1*32的卷積,參數計算如下所示。
4.實驗結果分析
註釋:(L表示網絡深度,k是增長率。黑色表示最新錯誤率,藍色表示最小錯誤率,+表示對原始數據庫進行了擴充。可以看出DenseNet相較於ResNet具有更低的錯誤率,而且使用了更少的參數)
註釋:(可以看出同樣層數的DenseNet的網絡參數要少,運算量少,準確率也高,錯誤率相差僅約3%)
原作者的一些解釋,以供學習:CVPR 2017 最佳論文,作者對於文章的解讀