【CV-Classification】DenseNet閱讀筆記
原論文鏈接:Densely Connected Convolutional Networks
motivation
基於ResNets,Highway Networks、Stochastic depth,FractalNets等模型表明,CNN輸入層和輸出層如果有較短的跳躍連接,卷積網路可以更準確和高效。作者提出密集卷積網路(DenseNet),每一卷積層以前饋的方式連接其他層。對於每個圖層都接收前面所有卷積圖層的特徵圖作為輸入,它自己的特徵圖被當做輸入進入後續的所有層,對於L層的CNN,傳統網路具有L層連接,而DenseNet有L(L+1)/2的連接。
DenseNet減輕梯度消失,加強特徵傳遞和特徵重用,較少網路參數使用,在CIFAR-10, CIFAR-100, SVHN, and ImageNet四個數據集都是state-of-art,取得CVPR 2017 Best Paper。
Architecture
如上圖所示,為了確保網路中各層之間的最大信息流,我們將所有圖層(具有相同尺寸的特徵圖)直接相互連接。在連接時,ResNets是通過求和方式進入下一層網路,而DenseNet通過concatenating方式,這也是為什麼DenseNet節省參數但耗內存的原因(本文結尾會討論)。
DenseNet這種稠密的連接方式比傳統的卷積網路更少的參數,因為沒有冗餘的特徵圖;DenseNet同時改善整個網路的信息流和梯度,每個圖層都與損失函數和原始信號連接,使網路更容易訓練;此外,DenseNet密集的連接具有正則化效應,減少小規模數據集的過擬合。(如何實現正則化?是否可以作為又一個坑寫個頂會文章?)
由於稠密連接要求特徵圖x0,x1,...,xl?1大小一致,而Pooling操作會改變特徵圖的大小,數據降維又不可或缺,於是就有了上圖中的分塊想法,論文中稱每個塊為DenseBlock。每個DenseBlock的之間層稱為transition layers,由BN+Conv(1×1) +averagePooling(2×2)組成。
怕讀者不明白,論文又從公式角度講一遍ResNet和DenseNet區別。H表示BN,ReLU和3x3 convolution組合函數。(相比其他論文中的公式,總是怕讓讀者太明白了)
為了降維,作者引入參數k,Bottleneck layers和參數θ。
參數k:本層特徵圖傳遞到下一層的數量,即為Growth Rate,用來控制網路的「寬度」(特徵圖的通道數),.比如說第l層有k(l?1)+k0的輸入特徵圖,k0是輸入圖片的通道數。
Bottleneck layers:雖然控制每個層只產生k個輸出,但是不同的層連接在一起數量依然很多,因此引入了Bottleneck layers 。本質上是引入1x1的卷積層來減少輸入的數量。H函數表示BN-ReLU-Conv(1×1)-BN-ReLU-Conv(3×3),Conv(1×1)講輸入特徵圖通道數降低到4k。文中將帶有Bottleneck layers的網路結構稱為DenseNet-B。
參數θ:論文在transition layers中來進一步Compression。如果一個DenseNet有m個特徵圖的輸出,則transition layer產生 ?θm?個輸出,其中0<θ≤1。對於含有該操作的網路結構稱為DenseNet-C。DenseNet-BC表示同時引入Bottleneck layers和Compression。
作者在論文中展示了DenseNet-121,DenseNet-169等網路架構,如圖上圖所示。
Experiment
作者比較不同模型在CIFAR和SVHN上的分類結果(錯誤率):
可以明顯看出DenseNet相比ResNet使用了更少的參數,取得更低的錯誤率。
同樣的在ImageNet上的分類結果:
對比ResNet-152和DenseNet-161,說明計算量方面,DenseNet結果更好。
Conclusion
DenseNet優點:
1、減輕了vanishing-gradient(梯度消失)
2、加強了feature的傳遞 :相比於一般神經網路的分類器直接依賴於網路最後一層(複雜度最高)的特徵,DenseNet 可以綜合利用淺層複雜度低的特徵,因而更容易得到一個光滑的具有更好泛化性能的決策函數,解決了過擬合的問題。
3、更有效地利用了feature,加強了特徵重用:each layer obtains additional inputs from all preceding layers and passes on its own feature-maps to all subsequent layers.
4、一定程度上較少了參數數量: DenseNet 每個基本單元(包含兩個卷積層,其輸入特徵圖的數量一般小於 2000)的參數量約為 2000x4x32x1x1 + 4x32x32x3x3 = 0.26M
DenseNet缺點:
DenseNet雖然有省參數的優點,但是在執行過程佔用大量內存。由於作者在層與層的連接之間使用拼接(Concatenation)操作,將之前層的輸出與當前層的輸出拼接在一起,然後傳給下一層。對於大多數深度學習框架,每次拼接操作都會開闢新的內存來保存拼接後的特徵。這樣就導致一個 L 層的網路,要消耗相當於 L(L+1)/2 層網路的內存。
作者團隊給出一個解決方案:預先分配一塊緩存,供網路中所有的拼接層(Concatenation Layer)共享使用,這樣 DenseNet 對內存的消耗便從平方級別降到了線性級別。在梯度反傳過程中,我們再把相應卷積層的輸出複製到該緩存,就可以重構每一層的輸入特徵,進而計算梯度。詳細的實現過程可以參考[arxiv:1707.06990] Memory-Efficient Implementation of DenseNets
下面是DenseNet優化後的代碼實現:
Torch implementation:https://github.com/liuzhuang13/DenseNet/tree/master/models
PyTorch implementation:https://github.com/gpleiss/efficient_densenet_pytorch
MxNet implementation:https://github.com/taineleau/efficient_densenet_mxnet
Caffe implementation:https://github.com/Tongcheng/DN_CaffeScript
返回CV-Classification目錄
返回CV總目錄
推薦閱讀:
※萬元深度學習電腦如何配置?
※如何看待顧險峰《看穿機器學習(W-GAN模型)的黑箱》這篇文章?
※在機器學習領域, 不同框架實現的相同演算法,差別能有多大?
※對於圖像識別和語音識別,其各自的深度學習框架的實現差異大嗎,假如理解了其中之一,轉向另一邊容易嗎?
※深度強化學習當中加入Memory replay的原因和作用是什麼?
TAG:深度学习DeepLearning | 计算机视觉 | 算法 |