通俗易懂DenseNet

寫在前面

在博客《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個

(1times 1)

卷積層和 1個

(3times 3)

卷積層堆疊而成,即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的示例,

圖中的

(x)

為feature map,特別地,

(x_0)

為網絡輸入,

(H)

為一組卷積,同Identity Mappings in Deep Residual Networks採用了pre activation方式,即BN-ReLU-

(1times 1)

Conv-BN-ReLU-

(3times 3)

Conv的bottleneck結構。

(x_i)

(H_i)

輸出的feature map,

(H_i)

的輸入為concatenation of

([x_0, x_1, dots, x_{i-1}])

。定義每個

(H)

輸出的 channel數為growth rate

(k =4)

,則

(H_i)

的輸入feature map有

(k_0 + ktimes (i-1))

個channel,特別地,

(k_0)

(x_0)

的channel數。所以,對於越靠後的

(H)

,其輸入feature map的channel越多,為了控制計算複雜度,將bottleneck中

(1times 1)

卷積的輸出channel數固定為

(4k)

。對於DenseNet的所有 Dense Block,growth rate均相同。

相鄰Dense Block 之間通過Transition Layer銜接,Transition Layer由1個

(1times 1)

卷積和

(2times 2)

的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的能力是不是會畫得更好呢?

以上。

參考