1. 程式人生 > >[Network Architecture]DPN(Dual Path Network)演算法詳解(轉)

[Network Architecture]DPN(Dual Path Network)演算法詳解(轉)

https://blog.csdn.net/u014380165/article/details/75676216

論文:Dual Path Networks
論文連結:https://arxiv.org/abs/1707.01629
程式碼:https://github.com/cypw/DPNs
MXNet框架下可訓練模型的DPN程式碼:https://github.com/miraclewkf/DPN

演算法詳解:
本篇博文要介紹的duall path networks(DPN)是顏水成老師新作,前段時間剛剛在arxiv上放出,對於影象分類的效果有一定提升。我們知道ResNet,ResNeXt,DenseNet等網路在影象分類領域的效果顯而易見,而DPN可以說是融合了ResNeXt和DenseNet的核心思想

,這裡為什麼不說是融合了ResNet和DenseNet,因為作者也用了group操作,而ResNeXt和ResNet的主要區別就在於group操作。如果你對ResNeXt不大瞭解,可以參考部落格:ResNeXt演算法詳解,如果你對DenseNet不大瞭解,可以參考部落格:DenseNet演算法詳解

那麼DPN到底有哪些優點呢?可以看以下兩點:
1、關於模型複雜度,作者的原文是這麼說的:The DPN-92 costs about 15% fewer parameters than ResNeXt-101 (32 4d), while the DPN-98 costs about 26% fewer parameters than ResNeXt-101 (64 4d).
2、關於計算複雜度

,作者的原文是這麼說的:DPN-92 consumes about 19% less FLOPs than ResNeXt-101(32 4d), and the DPN-98 consumes about 25% less FLOPs than ResNeXt-101(64 4d).

先放上網路結構Table1,有一個直觀的印象。其實DPN和ResNeXt(ResNet)的結構很相似。最開始一個7*7的卷積層和max pooling層,然後是4個stage,每個stage包含幾個sub-stage(後面會介紹),再接著是一個global average pooling和全連線層,最後是softmax層。重點在於stage裡面的內容,也是DPN演算法的核心。

這裡寫圖片描述

因為DPN演算法簡單講就是將ResNeXt和DenseNet融合成一個網路,因此在介紹DPN的每個stage裡面的結構之前,先簡單過一下ResNet(ResNeXt和ResNet的子結構在巨集觀上是一樣的)和DenseNet的核心內容。下圖中的(a)是ResNet的某個stage中的一部分。(a)的左邊豎著的大矩形框表示輸入輸出內容,對一個輸入x,分兩條線走,一條線還是x本身,另一條線是x經過1*1卷積,3*3卷積,1*1卷積(這三個卷積層的組合又稱作bottleneck),然後把這兩條線的輸出做一個element-wise addition,也就是對應值相加,就是(a)中的加號,得到的結果又變成下一個同樣模組的輸入,幾個這樣的模組組合在一起就成了一個stage(比如Table1中的conv3)。(b)表示DenseNet的核心內容。(b)的左邊豎著的多邊形框表示輸入輸出內容,對輸入x,只走一條線,那就是經過幾層卷積後和x做一個通道的合併(cancat),得到的結果又成了下一個小模組的輸入,這樣每一個小模組的輸入都在不斷累加,舉個例子:第二個小模組的輸入包含第一個小模組的輸出和第一個小模組的輸入,以此類推。

這裡寫圖片描述

DPN是怎麼做呢?簡單講就是將Residual Network 和 Densely Connected Network融合在一起。下圖中的(d)和(e)是一個意思,所以就按(e)來講吧。(e)中豎著的矩形框和多邊形框的含義和前面一樣。具體在程式碼中,對於一個輸入x(分兩種情況:一種是如果x是整個網路第一個卷積層的輸出或者某個stage的輸出,會對x做一個卷積,然後做slice,也就是將輸出按照channel分成兩部分:data_o1和data_o2,可以理解為(e)中豎著的矩形框和多邊形框;另一種是在stage內部的某個sub-stage的輸出,輸出本身就包含兩部分:data_o1和data_o2),走兩條線,一條線是保持data_o1和data_o2本身,和ResNet類似;另一條線是對x做1*1卷積,3*3卷積,1*1卷積,然後再做slice得到兩部分c1和c2,最後c1和data_o1做相加(element-wise addition)得到sum,類似ResNet中的操作;c2和data_o2做通道合併(concat)得到dense(這樣下一層就可以得到這一層的輸出和這一層的輸入),也就是最後返回兩個值:sum和dense。以上這個過程就是DPN中 一個stage中的一個sub-stage。有兩個細節,一個是3*3的卷積採用的是group操作,類似ResNeXt,另一個是在每個sub-stage的首尾都會對dense部分做一個通道的加寬操作。

這裡寫圖片描述

作者在MXNet框架下實現了DPN演算法,具體的symbol可以看:https://github.com/cypw/DPNs/tree/master/settings,介紹得非常詳細也很容易讀懂。

實驗結果:
Table2是在ImageNet-1k資料集上和目前最好的幾個演算法的對比:ResNet,ResNeXt,DenseNet。可以看出在模型大小,GFLOP和準確率方面DPN網路都更勝一籌。不過在這個對比中好像DenseNet的表現不如DenseNet那篇論文介紹的那麼喜人,可能是因為DenseNet的需要更多的訓練技巧。

這裡寫圖片描述

Figure3是關於訓練速度和儲存空間的對比。現在對於模型的改進,可能準確率方面的提升已經很難作為明顯的創新點,因為幅度都不大,因此大部分還是在模型大小和計算複雜度上優化,同時只要準確率還能提高一點就算進步了。

這裡寫圖片描述

作者的最後提到一個如果在測試階段,在網路結構後面加上mean-max pooling 層可以提高準確率,如下圖:

這裡寫圖片描述

更多實驗結果可以看論文。

總結:
作者提出的DPN網路可以理解為在ResNeXt的基礎上引入了DenseNet的核心內容,使得模型對特徵的利用更加充分。原理方面並不難理解,而且在跑程式碼過程中也比較容易訓練,同時文章中的實驗也表明模型在分類和檢測的資料集上都有不錯的效果。