DenseNet:密集連接卷積網(wǎng)絡(luò)

論文:Densely Connected Convolutional Networks

眾所周知,最近一兩年卷積神經(jīng)網(wǎng)絡(luò)提高效果的方向,要么深(比如ResNet,解決了網(wǎng)絡(luò)深時候的梯度消失問題)要么寬(比如GoogleNet的Inception),而作者則是從特征圖入手,通過對特征圖的極致利用達到更好的效果和更少的參數(shù)。

DenseNet的優(yōu)點

在深度學(xué)習(xí)網(wǎng)絡(luò)中,隨著網(wǎng)絡(luò)深度的加深,梯度消失問題會愈加明顯,目前很多論文都針對這個問題提出了解決方案,比如ResNet,Highway Networks,Stochastic depth,F(xiàn)ractalNets等,盡管這些算法的網(wǎng)絡(luò)結(jié)構(gòu)有差別,但是核心都在于:在前面的層和后面的層之間創(chuàng)建短路連接。那么作者是怎么做呢?延續(xù)這個思路,那就是——在保證網(wǎng)絡(luò)中層與層之間最大程度的信息傳輸?shù)那疤嵯拢苯訉⑺袑舆B接起來。為了能夠保證前饋的特性,每一層將之前所有層的輸入進行拼接,之后將輸出的特征圖傳遞給之后的所有層。

先放一個dense block的結(jié)構(gòu)圖。在傳統(tǒng)的卷積神經(jīng)網(wǎng)絡(luò)中,如果你有L層,那么就會有L個連接,但是在DenseNet中,會有L(L+1)/2個連接。與ResNets不同的是,DenseNets不是在特征傳遞給某一層之前將其進行相加(combine),而是將其進行拼接(concatenate)。因此,第 l 層有 l 個輸入,這些輸入是該層之前的所有卷積塊(block)的特征圖,而它自己的特征圖則傳遞給之后的所有層。由于它的稠密連接模塊,所以把這個方法稱為稠密卷積網(wǎng)絡(luò)(DenseNets)。如下圖:x0是input,H1的輸入是x0(input),H2的輸入是x0和x1(x1是H1的輸出)……

1. 減輕了vanishing-gradient(梯度消失)

這種連接方式使得特征和梯度的傳遞更加有效,網(wǎng)絡(luò)也就更加容易訓(xùn)練。每一層都可以直接利用損失函數(shù)的梯度以及最開始的輸入信息,相當(dāng)于是一種隱形的深度監(jiān)督(implicit deep supervision),這有助于訓(xùn)練更深的網(wǎng)絡(luò)。前面提到過梯度消失問題在網(wǎng)絡(luò)深度越深的時候越容易出現(xiàn),原因就是輸入信息和梯度信息在很多層之間傳遞導(dǎo)致的,而現(xiàn)在這種密集連接相當(dāng)于每一層都直接連接輸入和損失,因此就可以減輕梯度消失現(xiàn)象,這樣構(gòu)建更深的網(wǎng)絡(luò)不是問題。

2. 加強了特征的傳遞,更有效地利用了特征

每層的輸出特征圖都是之后所有層的輸入。

3. 一定程度上較少了參數(shù)數(shù)量

DenseNets的稠密連接模塊(dense block)的一個優(yōu)點是它比傳統(tǒng)的卷積網(wǎng)絡(luò)有更少的參數(shù),因為它不需要再重新學(xué)習(xí)多余的特征圖。傳統(tǒng)的前饋結(jié)構(gòu)可以被看成一種層與層之間狀態(tài)傳遞的算法。每一層接收前一層的狀態(tài),然后將新的狀態(tài)傳遞給下一層。它改變了狀態(tài),但也傳遞了需要保留的信息。ResNets將這種信息保留的更明顯,因為它加入了自身變換(identity transformations)。最近很多關(guān)于ResNets的研究都表明ResNets的很多層是幾乎沒有起作用的,可以在訓(xùn)練時隨機的丟掉。DenseNet結(jié)構(gòu)中,增加到網(wǎng)絡(luò)中的信息與保留的信息有著明顯的不同。DenseNet的dense block中每個卷積層都很窄(例如每一層有12個濾波器),僅僅增加小數(shù)量的特征圖到網(wǎng)絡(luò)的“集體知識”(collective knowledge),并且保持這些特征圖不變——最后的分類器基于網(wǎng)絡(luò)中的所有特征圖進行預(yù)測。

另外作者還觀察到這種密集連接有正則化的效果,因此對于過擬合有一定的抑制作用,因為參數(shù)減少了,所以過擬合現(xiàn)象減輕。

DenseNets

假設(shè)一張圖片 x0 在卷積網(wǎng)絡(luò)中傳播。網(wǎng)絡(luò)共有 L 層,每一層都有一個非線性轉(zhuǎn)換函數(shù)H_l (定義為三種操作的組合函數(shù),分別是:BN、ReLU和卷積),其中 l 表示第幾層。用 x_l 表示第 l 層的輸出。

傳統(tǒng)的前饋網(wǎng)絡(luò)是將 l-1 層的輸出x_{l-1}作為 l 層的輸入,得到 l 層的輸出 x_l,可用該方程來表示: x_l=H_l(x_{l-1})

  • ResNets增加了一個跨層連接,將自身與非線性轉(zhuǎn)換的結(jié)果相加:x_l=H_l(x_{l-1})+x_{l-1} 所以對于ResNet而言,l層的輸出是l-1層的輸出加上對l-1層輸出的非線性變換,這樣可以直接將梯度從后層傳向前層。然而,自身與經(jīng)過 H_l 得到的輸出是通過求和的形式來連接的,這可能使網(wǎng)絡(luò)中信息的傳播受到影響。

  • DenseNets為了更好的改善層與層之間信息的傳遞,提出一種不同的連接模式:將該層與之后的所有層進行連接。因此,l 層將之前所有層的特征圖 [x_0, x_1, ..., x_{l-1}] 作為輸入:x_l=H_l([x_0, x_1, ..., x_{l-1}]),輸入是之前所有特征圖的拼接。而前面resnet是做值的相加,通道數(shù)是不變的。

所以從這兩個公式就能看出DenseNet和ResNet在本質(zhì)上的區(qū)別。

結(jié)構(gòu)

前面的圖表示的是dense block,而下面的圖表示的則是一個DenseNet的結(jié)構(gòu)圖,在這個結(jié)構(gòu)圖中包含了3個dense block。作者將DenseNet分成多個dense block,原因是希望各個dense block內(nèi)的feature map的size統(tǒng)一,這樣在做concatenation就不會有size的問題。

增長速率k(growth rate):Dense block中,如果每個層函數(shù) H_l 都產(chǎn)生 k 個特征圖,那么第 l 層就有 k_0 + (l-1)k 個特征圖作為輸入,其中 k0 表示輸入層的通道數(shù)。DenseNet和現(xiàn)存網(wǎng)絡(luò)結(jié)構(gòu)的一個很重要的不同是,DenseNet的網(wǎng)絡(luò)很窄,如 k=12 。超參數(shù) k 稱為網(wǎng)絡(luò)的增長速率。一個很小的增長速率在測試的數(shù)據(jù)集上就可以獲得不錯的效果,因為每一層都可以和它所在的block中之前的所有特征圖進行連接,使得網(wǎng)絡(luò)具有了“集體知識”(collective knowledge)??梢詫⑻卣鲌D看作是網(wǎng)絡(luò)的全局狀態(tài),每一層相當(dāng)于是對當(dāng)前狀態(tài)增加 k 個特征圖。增長速率控制著每一層有多少信息對全局狀態(tài)有效。全局狀態(tài)一旦被寫定,就可以在網(wǎng)絡(luò)中的任何地方被調(diào)用,而不用像傳統(tǒng)的網(wǎng)絡(luò)結(jié)構(gòu)那樣層與層之間的不斷重復(fù)。

Bottleneck層:盡管每一層只產(chǎn)生 k 個輸出特征圖,但是根據(jù)dense block的設(shè)計,后面幾層可以得到前面所有層的輸入,因此拼接后的輸入通道數(shù)還是比較大的。研究表明,每個dense block的中3x3的卷積之前加入1x1的卷積(就是所謂的bottleneck layer)可以減少輸入的特征圖數(shù)量,減小計算量,同時能融合各個通道的特征。將具有bottleneck層,即 BN-ReLU-Conv(1x1)-BN-ReLU-Conv(3x3) 的結(jié)構(gòu)稱為DenseNet-B。在論文中,令1x1的卷積生成 4k 個特征圖。在每個Dense Block中都包含很多個子結(jié)構(gòu),以DenseNet-169的Dense Block(3)為例,包含32個1x1和3x3的卷積對,也就是第32個子結(jié)構(gòu)的輸入是前面31層的輸出結(jié)果,每層輸出的channel是 k=32。如果不做bottleneck操作,第 32 層的 3x3 卷積的輸入就是31x32+(該Dense Block的輸入channel),近1000了。而加上1x1的卷積,1x1卷積的輸出是 4k,也就是128,然后再作為3*3卷積的輸入,大大減少了計算量。

過渡層(Translation Layer):每兩個dense block之間的層稱為過渡層,完成卷積和池化的操作,目的是減小特征圖的數(shù)量。過渡層由BN層、1x1卷積層和2x2平均池化層組成。如果一個dense block有 m 個特征圖,我們讓之后的過渡層生成 \theta m 個輸出特征圖,其中 \theta 表示壓縮(compression)系數(shù)。定義 \theta <1 的 DenseNet 為 DenseNet-C,實驗中 \theta=0.5 。如果bottleneck和過渡層都有\theta<1 ,我們稱該模型為DenseNet-BC。還是以DenseNet-169的Dense Block(3)為例,雖然第32層的 3x3 卷積輸出channel只有32個,但是緊接著還會像前面幾層一樣有通道的拼接操作,即將第32層的輸出和第32層的輸入做拼接,前面說過第32層的輸入是1000左右的channel,所以最后每個Dense Block的輸出也是1000多的channel。因此經(jīng)過過渡層壓縮后,傳給下一個dense block的時候channel數(shù)量就會減少一半,這就是過度層的作用。文中還用到dropout操作來隨機減少分支,避免過擬合,畢竟 DenseNets 的連接確實多。

實現(xiàn)細節(jié)

在除了ImageNet外的所有數(shù)據(jù)集上,實驗中使用的DenseNet都有三個dense block,每一個block都有相同的層數(shù)。在進入第一個dense block之前,輸入圖像先經(jīng)過了16個(DenseNet-BC中是兩倍的增長速率)卷積。對于3x3的卷積層,使用一個像素的零填充來保證特征圖尺寸不變。在兩個dense block之間的過渡層中,我們在2x2的平均池化層之后增加了1x1的卷積。在最后一個dense block之后,使用全局平均池化和softmax分類器。三個dense block的特征圖的尺寸分別是32x32,16x16,8x8。

對于在ImageNet數(shù)據(jù)集上的實驗,我們使用4個dense block的DenseNet-BC結(jié)構(gòu),圖片的輸入是224x224。最開始的卷積層有 2k(64)個卷積,卷積核是7x7,步長是2;其余所有層的特征圖都設(shè)為 k 。在ImageNet數(shù)據(jù)集上的網(wǎng)絡(luò)如下表所示:

實驗結(jié)果

下表是在三個數(shù)據(jù)集(C10,C100,SVHN)上和其他算法的對比結(jié)果。ResNet就是kaiming He的論文,對比結(jié)果一目了然。DenseNet-BC的網(wǎng)絡(luò)參數(shù)和相同深度的DenseNet 相比確實減少了很多。參數(shù)減少除了可以節(jié)省內(nèi)存,還能減少過擬合。這里對于SVHN數(shù)據(jù)集,DenseNet-BC的結(jié)果并沒有DenseNet(k=24)的效果好,作者認為原因主要是SVHN這個數(shù)據(jù)集相對簡單,更深的模型容易過擬合。在表格的倒數(shù)第二個區(qū)域的三個不同深度 L 和 k 的DenseNet的對比可以看出隨著 L 和 k 的增加,模型的效果是更好的。

下圖是DenseNet-BC和ResNet在ImageNet數(shù)據(jù)集上的對比,左邊那個圖是參數(shù)復(fù)雜度和錯誤率的對比,可以在相同錯誤率下看參數(shù)復(fù)雜度,也可以在相同參數(shù)復(fù)雜度下看錯誤率,提升還是很明顯的。右邊是flops(可以理解為計算復(fù)雜度)和錯誤率的對比,同樣有效果。

Figure4也很重要。左邊的圖表示不同類型DenseNet的參數(shù)和error對比。中間的圖表示DenseNet-BC和ResNet在參數(shù)和error的對比,相同error下,DenseNet-BC的參數(shù)復(fù)雜度要小很多。右邊的圖也是表達DenseNet-BC-100只需要很少的參數(shù)就能達到和ResNet-1001相同的結(jié)果。

另外提一下DenseNet和stochastic depth的關(guān)系,在stochastic depth中,residual中的layers在訓(xùn)練過程中會被隨機drop掉,其實這就會使得相鄰層之間直接連接,這和DenseNet是很像的。

總結(jié):

該文章提出的 DenseNet 核心思想在于建立了不同層之間的連接關(guān)系,充分利用了特征圖,進一步減輕了梯度消失問題,加深網(wǎng)絡(luò)不是問題,而且訓(xùn)練效果非常好。另外,利用 bottleneck layer,translation layer 以及較小的 growth rate 使得網(wǎng)絡(luò)變窄,參數(shù)減少,有效抑制了過擬合,同時計算量也減少了。DenseNet 優(yōu)點很多,而且在和ResNet的對比中優(yōu)勢還是非常明顯的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容