論文題目:Densely Connected Convolutional Networks
文獻地址:https://arxiv.org/pdf/1608.06993.pdf
源碼地址:https://github.com/liuzhuang13/DenseNet
(非官方)源碼地址:https://github.com/pudae/tensorflow-densenet
DenseNet的提出主要受ResNet和Inception思想的影響,在網絡結構上要么深(ResNet),要么寬(Inception)。如果卷積網絡在接近輸入層和接近輸出層的層之間包含更短的連接,那么在訓練時卷積網絡可以更深入、更准確、更高效。
在CIFAR和SVHN數據集上的效果
上表展示了不同深度L和不同growth rates k的DenseNet模型在CIFAR和SVHN上的訓練的測試結果。可以看出DenseNet-BC(L=190, k=40)在所有CIFAR數據集上都優於現有的模型。在SVNH數據集中,DensNet(L=100,k=24)去的了最好的效果,作者認為250-layers DenseNet-BC沒有取得較好的結果是由於SVHN相對較容易,過深的網絡可能造成過擬合。
下圖是DenseNet-BC和ResNet在Imagenet數據集上的對比,左圖是參數量與驗證誤差的對比,提升還是很明顯的,畢竟非劣解前沿!右邊是flops(可以理解為計算復雜度)和驗證物產的對比,也處於非劣解前沿的狀態。
下圖左側圖中展示了不同DenseNet的參數量與測試誤差的對比;中間圖比較了DenseNet-BC與ResNet參數量和測試誤差的對比;右側圖中展示了DenseNet-BC與ResNet-1001訓練誤差和測試誤差的對比,DenseNet-BC具有極少的參數量,但卻可以達到與ResNet-1001差不多的精度。
優勢
- 減輕了梯度消失的問題;
- 加強了特征的傳遞;
- 高效利用特征(reuse);
- 在一定程度上減少了參數量。
網絡結構
深度學習中,雖然網絡深度的加深有助於提高模型的表達能力,但隨着深度的加深也會出現一個問題:輸出和梯度的信息通過很多層時可能會消失。許多研究都在針對解決這一問題,如ResNets、Highway Networks、Stochastic depth 、 FractalNets等。盡管這些不同的方法在網絡拓撲結構和訓練過程中各不相同,但它們都有一個關鍵特征:它們創建了從早期層到后期層的捷徑。
延續這一關鍵特征,為了確保網絡中各層之間的信息流達到最大,作者將所有層連接起來!為了保持前饋特性,每一層都從前面的所有層獲得額外的輸入,並將自己的特性映射傳遞給后面的所有層。如下圖所示,每一層均與其他層建立有連接。重要的是,與ResNets不同的是,不會在特征被傳遞到一個層之前通過求和來組合它們;相反,是通過連接這些特性來組合它們。
第l層包含l個輸入,由之前所有卷積塊的特征和輸入圖像組成。並且第l層的輸出將會作為后續L-l個層的輸入。因此,對於L-layer的網絡,共包含L(L+1)/2個連接,而不是L個連接。簡而言之,每一層的輸入來與前面所有層的輸出。
這種密集連接模式的一個可能與直覺相反的效果是,它比傳統的卷積網絡需要更少的參數,因為不需要重新學習冗余的特征映射。這怎么理解呢?一方面,其growth rate值較小,即每次輸出的通道數量並不會成倍增加;另一方面,在Dense Block之間會包含Transition Layer(1*1卷積)進行通道數量減半,並且每個Dense Block內部的連接之間也包含1*1卷積進行通道數量減半,【詳見后文表一的描述】輸入通道數量的減少將會極大減少每個卷積核的厚度,即需要更少的參數。參數量的減少會使得Dense block這種結構具有正則化的效果,在一定程度上可以防止過擬合。
DenseNet的一個優點是網絡更窄,這種"窄"在於通道數量成倍增長,在dense block中每個卷積層的輸出feature map的數量都很小(小於100)。【由於包含不同層之間輸出通道數量的融合,所以不能像現有的其他模型,每進行一次卷積運算,通道數量都會成倍增長。】
另一方面,DenseNet可以很好的減輕梯度消失的問題,因為每一層實際上都直接連接input和loss。
整篇論文中僅僅通過兩個公式描述了DenseNet與ResNet的區別。
- ResNets,l表示第l層,Hl表示非線性變換(BN、ReLU、Pooling、Conv),xl表示第l層的輸出,可以看出,ResNets是特征被傳遞到一個層之前通過求和來組合它們。
- DenseNet,[x0, x1,... ,xl-1]表示層0到l-1的輸出feature map。整合操作Hl包含三種相關操作:BN、ReLU、3*3Conv,與ResNets不同。
圖一表示的是dense block,而下圖二表示的則是一個DenseNet的結構圖,這個結構圖中包含了3個dense block。作者將DenseNet分成多個dense block,原因是希望各個dense block內的feature map的size統一,這樣在做concatenation就不會有size的問題。
目前為止,關於DenseNet的具體結構還是有些朦朧。下表展示了不同深度DenseNet的具體結構,其中,Transition層中包括BN層和1×1卷積層,和 2×2平均池化層。
在表一的聲明中,談到了一個growth rate 參數k。該參數是做什么的呢?假設每個Hl產生k個feature map,即通道數量,那么第l層的輸入的feature map將會包含 k0+k*(l-1)個通道數量。其中,k0表示輸入層的通道數量。k實際上生成的就是通道數量,由於越靠后的層包含更多的輸入,如果每層輸出的通道數量過大,組合后的通道數量將會更大,將產生極大的參數量和運算量。因此,k值的設置實際上也是與其他網絡結構的重要區別,也就是之前提到的DenseNet可以有很窄的層,即通道數量沒有增長到成百上千,這樣可以大大減少參數量。並且在每個Dense Block之間都會包含1*1卷積對輸入feature map的通道數量減半;Dense Block中各個卷積操作也是采用Bottleneck layer操作,即先通過1*1卷積進行通道數量的減半,從而極大的減少參數量。
值得注意的是,上述DenseNet網絡結構中Transition Layer使用的是平均池化,而不是最大池化。
總結
DenseNet的核心思想在於建立了不同層之間的連接關系,通過這種連接做出了比ResNet更好的網絡結構,進一步減輕了梯度消失問題。並且網絡很窄,極大的減少了參數量,有助於抑制過擬合的問題。參數量的減少也帶來計算量的減少。經常出現在小目標檢測的場景中。