論文筆記——DenseNet

《Densely Connected Convolutional Networks》閱讀筆記git

代碼地址:https://github.com/liuzhuang13/DenseNet
首先看一張圖:

稠密鏈接:每層以以前層的輸出爲輸入,對於有L層的傳統網絡,一共有L個鏈接,對於DenseNet,則有L(L+1)2。github

這篇論文主要參考了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(xl−1)+xl−1ide

這樣作的好處是the gradient flows directly through the identity function from later layers to the earlier layers.
同時呢,因爲identity function 和 H的輸出經過相加的方式結合,會妨礙信息在整個網絡的傳播。
受GooLeNet的啓發,DenseNet經過串聯的方式結合:函數

xl=Hl([x0,x1,...,xl−1])
這裏Hl(.)是一個Composite function,是三個操做的組合:BN−>ReLU−>Conv(3×3)
因爲串聯操做要求特徵圖x0,x1,...,xl−1大小一致,而Pooling操做會改變特徵圖的大小,又不可或缺,因而就有了上圖中的分塊想法,其實這個想法相似於VGG模型中的「卷積棧」的作法。論文中稱每一個塊爲DenseBlock。每一個DenseBlock的之間層稱爲transition layers,由BN−>Conv(1×1)−>averagePooling(2×2)組成。字體

Growth rate:因爲每一個層的輸入是全部以前層輸出的鏈接,所以每一個層的輸出不須要像傳統網絡同樣多。這裏Hl(.)的輸出的特徵圖的數量都爲k,k即爲Growth Rate,用來控制網絡的「寬度」(特徵圖的通道數).好比說第l層有k(l−1)+k0的輸入特徵圖,k0是輸入圖片的通道數。.net

雖說每一個層只產生k個輸出,可是後面層的輸入依然會不少,所以引入了Bottleneck layers 。本質上是引入1x1的卷積層來減小輸入的數量,Hl的具體表示以下orm

BN−>ReLU−>Conv(1×1)−>BN−>ReLU−>Conv(3×3)

文中將帶有Bottleneck layers的網絡結構稱爲DenseNet-B。
除了在DenseBlock內部減小特徵圖的數量,還能夠在transition layers中來進一步Compression。若是一個DenseNet有m個特徵圖的輸出,則transition layer產生 ⌊θm⌋個輸出,其中0<θ≤1。對於含有該操做的網絡結構稱爲DenseNet-C。

同時包含Bottleneck layer和Compression的網絡結構爲DenseNet-BC。
具體的網絡結構:

實驗以及一些結論
在CIFAR和SVHN上的分類結果(錯誤率):

L表示網絡深度,k爲增加率。藍色字體表示最優結果,+表示對原數據庫進行data augmentation。能夠發現DenseNet相比ResNet能夠取得更低的錯誤率,而且使用了更少的參數。
接着看一組對比圖:

前兩組描述分類錯誤率與參數量的對比,從第二幅能夠看出,在取得相同分類精度的狀況下,DenseNet-BC比ResNet少了23的參數。第三幅圖描述含有10M參數的1001層的ResNet與只有0.8M的100層的DenseNet的訓練曲線圖。能夠發現ResNet能夠收斂到更小的loss值,可是最終的test error與DenseNet相差無幾。再次說明了DenseNet參數效率(Parameter Efficiency)很高!

一樣的在ImageNet上的分類結果:

右圖使用FLOPS來講明計算量。經過比較ResNet-50,DenseNet-201,ResNet-101,說明計算量方面,DenseNet結果更好。

轉至:http://blog.csdn.net/u012938704/article/details/53468483

相關文章
相關標籤/搜索