Paper:
https://arxiv.org/abs/1608.06993(DenseNet)
https://arxiv.org/pdf/1707.06990.pdf(Memory-Efficient DenseNet)
Code:
https://github.com/liuzhuang13/DenseNet
https://github.com/gpleiss/efficient_densenet_pytorch
思路來源:
通過對ResNet有效性的研究,發現主要來源 "短連接"。於是論文將這個思想應用到極致。就是每一層的輸入來自前面所有層的輸出,利用concat在channel進行此前每一層的輸出。考慮到concat需要保證特徵圖的size一致,因此作者提出Dense-block,在block內部採用密集鏈接。爲防止concat過多的特徵圖,在block內的層與層之間又包含bottleneck layer;在block之間也採用bottleneck layer。
優點:
1,減輕了vanishing-gradient(梯度消失)------- shortcuts
2,加強了feature的傳遞 ,更有效地利用了feature --------- 密集連接和特徵複用。所謂特徵複用,每一層輸出的特徵圖直接concat在之前特徵圖中,最終得到的特徵圖既包含第一層又包含最後一層的輸出。
3, 一定程度上較少了參數數量 -------- 無論在block內的每一層輸出(k)還是block之間的輸出(4*k)的特徵圖的個數較ResNet(512、1024等)少很多。由參數量的計算公式,可得。
DenseNet需要高顯存的原因:
和ResNet及其他CNN不同的是,DenseNet是密集連接,就是每一層的輸入來自前面所有層的輸出,因此在前向過程中需要保存之前的特徵圖。而ResNet及其他CNN只需要保留前一層的特徵圖即可。當然都需要保存權重參數。未解決此問題,由此產生下文。
知識點簡述:
對於特徵的極致利用可以提高模型的表現能力,用時由於生成大量的intermediate feature(中間特徵),因此存儲這些intermediate feature會佔用大量的顯存。爲了能夠在GPU下跑更深的densenet網絡,這篇文章通過對中間特徵採用共享存儲空間的方式降低了模型顯存,使得在GPU顯存限制下可以訓練更深的densenet網絡。當然這種共享部分存儲也引入了額外的計算時間,因爲在反向傳播的時候需要重新計算一些層的輸出,實際表現差不多增加了15%-20%的訓練時間。