通俗易懂DenseNet

博客:博客園 | CSDN | bloggit

寫在前面

在博客《ResNet詳解與分析》中,咱們談到ResNet不一樣層之間的信息流通隱含在「和」中,因此從信息流通的角度看並不完全,相比ResNet,DenseNet最大的不一樣之處在於,並不對feature map求element-wise addition,而是經過concatenation將feature map拼接在一塊兒,因此DenseNet中的卷積層知道前面每一步卷積發生了什麼。github

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串聯而成,以下圖所示架構

https://arxiv.org/abs/1608.06993

Dense Block與Transition Layer

在每一個Dense Block內部,每一個卷積層能夠知道前面全部卷積層輸出的feature map是什麼,由於它的輸入爲前面全部卷積層輸出的feature map拼接而成,換個角度說,每一個卷積層獲得的feature map要輸出給它後面全部的卷積層。這裏說「每一個卷積層」並不許確,更準確的說法應該是「每組卷積」,後面將看到,一組卷積是由1個\(1\times 1\)卷積層和 1個\(3\times 3\)卷積層堆疊而成,即bottleneck結構app

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的示例,學習

https://arxiv.org/abs/1608.06993

圖中的\(x\)爲feature map,特別地,\(x_0\)爲網絡輸入,\(H\)爲一組卷積,同Identity Mappings in Deep Residual Networks採用了pre activation方式,即BN-ReLU-\(1\times 1\)Conv-BN-ReLU-\(3\times 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 + k\times (i-1)\)個channel,特別地,\(k_0\)\(x_0\)的channel數。因此,對於越靠後的\(H\),其輸入feature map的channel越多,爲了控制計算複雜度,將bottleneck中\(1\times 1\)卷積的輸出channel數固定爲\(4k\)。對於DenseNet的全部 Dense Block,growth rate均相同。spa

相鄰Dense Block 之間經過Transition Layer銜接,Transition Layer由1個\(1\times 1\)卷積和\(2\times 2\)的average pooling構成,前者將輸入feature map的channel數壓縮一半,後者將feature map的長寬尺寸縮小一半。.net

可見,bottleneck和Transition Layer的做用都是爲了提升計算效率以及壓縮參數量。

DenseNet網絡架構與性能

DenseNet用於ImageNet的網絡架構以下,經過上面的介紹,這裏的架構不難理解。

https://arxiv.org/abs/1608.06993

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

https://arxiv.org/abs/1608.06993

理解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.

https://arxiv.org/abs/1608.06993

圖中可見每一個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的能力是否是會畫得更好呢?

以上。

參考

相關文章
相關標籤/搜索