1. 程式人生 > >(深度學習)比較新的網路模型:Inception-v3 , ResNet, Inception-v4, Dual-Path-Net , Dense-net , SEnet , Wide ResNet

(深度學習)比較新的網路模型:Inception-v3 , ResNet, Inception-v4, Dual-Path-Net , Dense-net , SEnet , Wide ResNet

1. Inception-v3 (Dec,2015)

2. ResNet(Dec,2015)

3. nception-v4(Aug,2016)

4. Dual-Path-Net (Aug,2017)

5. Dense-net(Aug,2017)

6. SEnet(Sep,2017)

7. Wide Residual NetworksJun 2017)

Inception V3(還有 V2)

Christian 和他的團隊都是非常高產的研究人員。2015 年 2 月,Batch-normalized Inception 被引入作為 Inception V2(參見論文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift)。Batch-normalization 在一層的輸出上計算所有特徵對映的均值和標準差,並且使用這些值規範化它們的響應。這相當於資料「增白(whitening)」,因此使得所有神經圖(neural maps)在同樣範圍有響應,而且是零均值。在下一層不需要從輸入資料中學習 offset 時,這有助於訓練,還能重點關注如何最好的結合這些特徵。

2015 年 12 月,該團隊釋出 Inception 模組和類似架構的一個新版本(參見論文:Rethinking the Inception Architecture for Computer Vision)。該論文更好地解釋了原始的 GoogLeNet 架構,在設計選擇上給出了更多的細節。原始思路如下:

通過謹慎建築網路,平衡深度與寬度,從而最大化進入網路的資訊流。在每次池化之前,增加特徵對映。

當深度增加時,網路層的深度或者特徵的數量也系統性的增加。

使用每一層深度增加在下一層之前增加特徵的結合。

只使用 3×3 的卷積,可能的情況下給定的 5×5 和 7×7 過濾器能分成多個 3×3。看下圖

因此新的 Inception 成為了:

也可以通過將卷積平整進更多複雜的模組中而分拆過濾器:

在進行 inception 計算的同時,Inception 模組也能通過提供池化降低資料的大小。這基本類似於在執行一個卷積的時候並行一個簡單的池化層:

Inception 也使用一個池化層和 softmax 作為最後的分類器。

ResNet

2015 年 12 月又出現了新的變革,這和 Inception V3 出現的時間一樣。ResNet 有著簡單的思路:供給兩個連續卷積層的輸出,並分流(bypassing)輸入進入下一層(參見論文:Deep Residual Learning for Image Recognition)
這個model是2015年底最新給出的,也是15年的imagenet比賽冠軍。可以說是進一步將conv進行到底,其特殊之處在於設計了“bottleneck”形式的block(有跨越幾層的直連)。

這和之前的一些舊思路類似。但 ResNet 中,它們分流兩個層並被應用於更大的規模。在 2 層後分流是一個關鍵直覺,因為分流一個層並未給出更多的改進。通過 2 層可能認為是一個小型分類器,或者一個 Network-In-Network。
這是第一次網路層數超過一百,甚至還能訓練出 1000 層的網路。
有大量網路層的 ResNet 開始使用類似於 Inception 瓶頸層的網路層:

這種層通過首先是由帶有更小輸出(通常是輸入的 1/4)的 1×1 卷積較少特徵的數量,然後使用一個 3×3 的層,再使用 1×1 的層處理更大量的特徵。類似於 Inception 模組,這樣做能保證計算量低,同時提供豐富的特徵結合。
ResNet 在輸入上使用相對簡單的初始層:一個帶有兩個池的 7×7 卷基層。可以把這個與更復雜、更少直覺性的 Inception V3、V4 做下對比。
ResNet 也使用一個池化層加上 softmax 作為最後的分類器。
關於 ResNet 的其他貢獻每天都有發生:
ResNet 可被認為既是平行模組又是連續模組,把輸入輸出(inout)視為在許多模組中並行,同時每個模組的輸出又是連續連線的。
ResNet 也可被視為並行模組或連續模組的多種組合(參見論文:Residual Networks are Exponential Ensembles of Relatively Shallow Networks)。
已經發現 ResNet 通常在 20-30 層的網路塊上以並行的方式執行。而不是連續流過整個網路長度。
當 ResNet 像 RNN 一樣把輸出反饋給輸入時,該網路可被視為更好的生物上可信的皮質模型(參見論文:Bridging the Gaps Between Residual Learning, Recurrent Neural Networks and Visual Cortex)。
最深的model採用的152層!!下面是一個34層的例子,更深的model見表格。 
這裡寫圖片描述 
其實這個model構成上更加簡單,連LRN這樣的layer都沒有了。
這裡寫圖片描述
block的構成見下圖:
這裡寫圖片描述

Inception V4

這是 Christian 與其團隊的另一個 Inception 版本,該模組類似於 Inception V3:

Inception V4 也結合了 Inception 模組和 ResNet 模組:

我認為該架構不太簡潔,但也滿滿都是較少透明度的啟發法(heuristics)。很難理解裡面的選擇,對作者們而言也難以解釋。

考慮到網路的簡潔性,可被輕易的理解並修正,那 ResNet 可能就更好了。

Dual-Path-Net

參考:http://blog.csdn.net/u014380165/article/details/75676216

演算法詳解: 
本篇博文要介紹的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部分做一個通道的加寬操作。

這裡寫圖片描述

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

這裡寫圖片描述

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

這裡寫圖片描述

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

這裡寫圖片描述

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

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

Dense-net 

參考:http://blog.csdn.net/u012938704/article/details/53468483

首先看一張圖: 
這裡寫圖片描述 
稠密連線:每層以之前層的輸出為輸入,對於有L層的傳統網路,一共有L個連線,對於DenseNet,則有L(L+1)2

這篇論文主要參考了Highway Networks,Residual Networks (ResNets)以及GoogLeNet,通過加深網路結構,提升分類結果。加深網路結構首先需要解決的是梯度消失問題,解決方案是:儘量縮短前層和後層之間的連線。比如上圖中,H4層可以直接用到原始輸入資訊X0,同時還用到了之前層對X0處理後的資訊,這樣能夠最大化資訊的流動。反向傳播過程中,X0的梯度資訊包含了損失函式直接對X0的導數,有利於梯度傳播。 
DenseNet有如下優點: 
1.有效解決梯度消失問題 
2.強化特徵傳播 
3.支援特徵重用 
4.大幅度減少引數數量

接著說下論文中一直提到的Identity function: 
很簡單 就是輸出等於輸入f(x)=x 
這裡寫圖片描述

傳統的前饋網路結構可以看成處理網路狀態(特徵圖?)的演算法,狀態從層之間傳遞,每個層從之前層讀入狀態,然後寫入之後層,可能會改變狀態,也會保持傳遞不變的資訊。ResNet是通過Identity transformations來明確傳遞這種不變資訊。

網路結構: 
這裡寫圖片描述
每層實現了一組非線性變換Hl(.),可以是Batch Normalization (BN) ,rectified linear units (ReLU) , Pooling , or Convolution (Conv). 第l層的輸出為xl。 
對於ResNet: 

xl=Hl(xl1)+xl1
這樣做的好處是the gradi