通俗易懂DenseNet
- 2020 年 3 月 4 日
- 筆記
寫在前面
在博客《ResNet詳解與分析》中,我們談到ResNet不同層之間的信息流通隱含在「和」中,所以從信息流通的角度看並不徹底,相比ResNet,DenseNet最大的不同之處在於,並不對feature map求element-wise addition,而是通過concatenation將feature map拼接在一起,所以DenseNet中的卷積層知道前面每一步卷積發生了什麼。
Crucially, in contrast to ResNets, we never combine features summation before they are passed into a layer; instead, we combine features by concatenating them.
同ResNet結構類似,DenseNet也是由多個Dense Block串聯而成,如下圖所示

Dense Block與Transition Layer
在每個Dense Block內部,每個卷積層可以知道前面所有卷積層輸出的feature map是什麼,因為它的輸入為前面所有卷積層輸出的feature map拼接而成,換個角度說,每個卷積層得到的feature map要輸出給它後面所有的卷積層。這裡說「每個卷積層」並不準確,更準確的說法應該是「每組卷積」,後面將看到,一組卷積是由1個
卷積層和 1個
卷積層堆疊而成,即bottleneck結構。
to ensure maximum information flow between layers in the network, we connect all layers (with matching feature-map sizes) directly with each other. To preserve the feed-forward nature, each layer obtains additional inputs from all preceding layers and passes on its own feature-maps to all subsequent layers.
下面看一個Dense Block的示例,

圖中的
為feature map,特別地,
為網絡輸入,
為一組卷積,同Identity Mappings in Deep Residual Networks採用了pre activation方式,即BN-ReLU-
Conv-BN-ReLU-
Conv的bottleneck結構。
為
輸出的feature map,
的輸入為concatenation of
。定義每個
輸出的 channel數為growth rate
,則
的輸入feature map有
個channel,特別地,
為
的channel數。所以,對於越靠後的
,其輸入feature map的channel越多,為了控制計算複雜度,將bottleneck中
卷積的輸出channel數固定為
。對於DenseNet的所有 Dense Block,growth rate均相同。
相鄰Dense Block 之間通過Transition Layer銜接,Transition Layer由1個
卷積和
的average pooling構成,前者將輸入feature map的channel數壓縮一半,後者將feature map的長寬尺寸縮小一半。
可見,bottleneck和Transition Layer的作用都是為了提高計算效率以及壓縮參數量。
DenseNet網絡架構與性能
DenseNet用於ImageNet的網絡架構如下,通過上面的介紹,這裡的架構不難理解。

DenseNet的Parameter Efficiency很高,可以用少得多的參數和計算複雜度,取得與ResNet相當的性能,如下圖所示。

理解DenseNet
DenseNet最終的輸出為前面各層輸出的拼接,在反向傳播時,這種連接方式可以將最終損失直接回傳到前面的各個隱藏層,相當於某種Implicit Deep Supervision,強迫各個隱藏層學習到更有區分里的特徵。
DenseNet對feature map的使用方式可以看成是某種多尺度特徵融合,文中稱之為feature reuse,也可以看成是某種「延遲決定」,綜合前面各環節得到的信息再決定當前層的行為。文中可視化了同block內每層對前面層的依賴程度,
For each convolutional layer 『 within a block, we compute the average (absolute) weight assigned to connections with layers. Figure 5 shows a heat-map for all three dense blocks. The average absolute weight serves as a surrogate for the dependency of a convolutional layer on its preceding layers.

圖中可見每個Dense Block中每層對前面層的依賴程度,約接近紅色表示依賴程度越高,可以看到,
- Dense Block內,每個層對其前面的feature map利用方式(依賴程度)是不一樣的,相當於某種「注意力」
- Transition Layer 以及最後的Classification Layer對其前面相對宏觀的特徵依賴較高,這種趨勢越深越明顯
Plain Net、ResNet與DenseNet
這裡做一個可能並不恰當的比喻,對比一下Plain Net、ResNet 與 DenseNet。
如果將網絡的行為比喻成作畫,已知最終希望畫成的樣子,但要經過N個人之手,每個人繪畫能力有限,前面一個人畫完交給後面的人。
- Plain Net:前面一個人畫完,後面一個人只能參照前一個人畫的自己重新繪製一張,儘管他能力有限,但他必須得畫。
- ResNet:前面一個人畫完,後面一個人在其基礎上作畫,他更多地關注當前畫與最終畫的差異部分,同時他還有不畫的權利。
- DenseNet:當前作畫的人可以看到前面所有人的畫,同時他還知道大家繪畫的順序以及誰的畫工相對更好更可靠,他參照前面所有的畫自己重新繪製一張,然後連同前面所有的畫一同交給後面的人。
不難看出,ResNet和DenseNet的側重點不太一樣,但大概率應該都比Plain Net畫的更好。
所以,要是綜合ResNet和DenseNet的能力是不是會畫得更好呢?
以上。
參考
- paper: Densely Connected Convolutional Networks
- code: pytorch-densenet.py
- Densely Connected Networks (DenseNet)