DenseNet
論文:Densely Connected Convolutional Networks
DenseNet是在ResNet之後的一個分類網絡,連接配接方式的改變,使其在各大資料集上取得比ResNet更好的效果.
網絡結構
以DenseNet-121為例,介紹網絡的結構細節.

網絡結構一開始與ResNet類似,先進行一個大尺度的卷積,再接一個池化層;随後接上連續幾個子子產品(Dense Block和Transitin Layer);最後接上一個池化和全連接配接.
以下重點介紹Dense Block 和 Transition layer.
Dense Block
從圖中可以看到,第一個DenseBlock包含6個[1*1 conv, 3*3 conv], 此處的[1*1 conv, 3*3 conv]即為Bottleneck結構,具體如下:
我字怎麼這麼醜 = =!
BottleNeck包含兩個卷積,和正常的卷積-BN-ReLU模式不一樣,此處的BN-ReLU放在卷積前面(有文章實驗證明過這樣效果更好).1*1卷積的輸出通道數是 4 ∗ k 4*k 4∗k,此處k是一個特征圖增長系數,可以了解成BottleNeck貢獻的特征圖個數;3*3卷積的輸出通道數是 k k k;整個子產品的輸出是将輸入和3*3卷積的輸出堆疊在一起(concat),即共輸出 i n _ c h a n n e l s + k in\_channels + k in_channels+k個通道.
接下來介紹為什麼網絡是密集連接配接的!
DenseNet-121的第一個DenseBlock包含了6個BottleNeck,BottleNeck之間是串聯在一起的.
圖中橫向表示特征圖,縱向表示BottleNecks.整個DenseBlck的輸入通道個數為 n 0 n_0 n0.相應顔色的BottleNeck産生對應顔色的 k k k個特征圖.由于BottleNeck的輸出将本身的輸出( k k k個通道)和輸入concat在一起了,是以輸出為 n 0 + k n_0+k n0+k個通道,以此類推,後續通道數每經過一個BottleNeck,通道數增加 k k k個(是以稱 k k k為通道增加系數).
以粉紅色BottleNeck為例,說明整個DenseBlock為密集連接配接.
仔細觀察粉紅色BotteNeck的輸入,其實是來自于前面每一層BottleNeck輸出和原始輸入的堆疊.而且每一個BottleNeck的輸入都是其前面所有層輸出的堆疊,這就是DenseNet為什麼是密集連接配接的原因,也是DenseNet取得良好效果的原因:
- 傳遞到粉紅色BottleNeck的梯度,能直接傳遞到其前面各層BottleNeck中,一方面避免了梯度消失,另一方面加快了參數的疊代速度,提高了訓練效率
- 網絡在前向傳播過程中,每個BottleNeck利用其前面所有網絡層的輸出結果作為輸入,産生 k k k個特征圖.作者認為這是一個利用目前"集體成果"(前面所有層的輸出),産生新特征,同時再将新特征加入"集體成果"中,不斷成長壯大的過程.
- ResNet中BottleNeck的輸出和原始輸入的融合方式采用的是相加,作者認為這種方式會破壞已經學到的特征,是以采用concat的方式.
Transition layer
Transition Layer就比較平平無奇了,是一個卷積加池化,用于整合學到的特征,降低特征圖的尺寸.
小結
網絡四個優點
- 減輕梯度消失
- 提高了特征的傳播效率
- 提高了特征的利用效率
- 減小了網絡的參數量