[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??梢钥闯鲈谀P痛笮?#xff0c;GFLOP和準確率方面DPN網絡都更勝一籌。不過在這個對比中好像DenseNet的表現不如DenseNet那篇論文介紹的那么喜人,可能是因為DenseNet的需要更多的訓練技巧。
Figure3是關于訓練速度和存儲空間的對比。現在對于模型的改進,可能準確率方面的提升已經很難作為明顯的創新點,因為幅度都不大,因此大部分還是在模型大小和計算復雜度上優化,同時只要準確率還能提高一點就算進步了。
作者的最后提到一個如果在測試階段,在網絡結構后面加上mean-max pooling 層可以提高準確率,如下圖:
更多實驗結果可以看論文。
總結:
作者提出的DPN網絡可以理解為在ResNeXt的基礎上引入了DenseNet的核心內容,使得模型對特征的利用更加充分。原理方面并不難理解,而且在跑代碼過程中也比較容易訓練,同時文章中的實驗也表明模型在分類和檢測的數據集上都有不錯的效果。
轉載于:https://www.cnblogs.com/kk17/p/9998406.html
總結
以上是生活随笔為你收集整理的[Network Architecture]DPN(Dual Path Network)算法详解(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java证明ArrayList是线程不安
- 下一篇: android 分享小程序到微信,And