深度學習之DenseNet
本文假設你已經對DenseNet的網路結構有一定的認識,不需要進行詳細的結構介紹,本文重心在與如何使用DenseNet、參數細節介紹,以及作者是如何訓練得到令人驚訝的結果的。卷積網路目前發展分為兩類,以inception為典型的並行結構與ResNet為典型的串列結構,作者以一個新穎的思路發明了一種新的網路結構,比其他經典網路參數更少,更容易收斂。
超參數
DenseNet的作者認為ResNet的恆等函數與輸出H通過加法聯繫到一起,可能會阻礙信息的流動。而DenseNet的這個結構正好可以改善這種情況。
如果把DenseNet當做黑盒子來使用的話,你需要了解一些重要的參數,growth_rate與depth。增長率與深度,增長率的大小決定了當前層的輸出維度。而depth很顯然代表了你創建的網路深度。如果你了解ResNet的基礎知識話,就會知道殘差網路是以殘差塊為一個單位進行組織,DenseNet同樣如此,total_blocks參數代表將會有多少block。
這裡寫圖片描述
通過此圖,我們可以看到有3個block,growth_rate為5。DenseNet通過卷積與平均池化,接連兩個block。keep_prob是dropout的參數,不僅使用了dropout正則化,而且還使用了BN正則化。記得inception-v3網路中使用的BN代替了dropout,理由是BN已經有正則化效果了,不需要dropout,此外作者還用到了L2正則化。從此點來看,作者明顯沒有受到前人的約束勇於創新。結構如下,BN+Relu+Conv+Dropout
weight_decay是BN中的權重衰減係數,一般設置為0.9、0.95。nesterov_momentum參數是動量梯度下降的參數,但是我查看論文作者使用的還是SGD,這讓我想起了之前有個爭論,Adam到底好不好?有的科研人員驗證出Adam是最好的梯度下降方法,也有另外一派,找出了Adam失效的特殊情況。果然還是SGD最靠譜。model_type參數是使用DenseNet還是使用DenseNet-BC,這兩個網路的區別還是要從原文中來看,作者為了使得模型更加的緊湊,如果denseblock有k個特徵映射,也就是維度數,把連接兩個block的層我們稱為transition層,通過這個層進行特徵降維,輸出Qk 維,Q
訓練細節
除了 ImageNet數據集,作者訓練其他的數據集使用3個dense blocks,並且每個block中層數相同,在第一個dense block之前的第一層卷積網路輸出16個channel(或者兩倍的增長率,使用DenseNet-BC網路),核的大小為33,使用11卷積後接22的平均池化作為連接兩個block 的transition層。對於L(深度)與k(增長率),作者使用的有(40,12)、(100,12)、(100、24)。對於DenseNet-BC參數設置為(100,12),(250,24),(190,40)。對於ImageNet數據集,作者訓練的方式如下:使用4個dense block ,input大小為224224,初始化第一層卷積是由輸出維度為2k,卷積核大小為7*7,步長為2,剩下的featrue-maps(特徵映射大小設置為k)
這裡寫圖片描述
,此外還有一處區別,就是紅框畫出的部分,並不是每個block層數都相同。這個可能需要你自己設置。我翻閱了基於tensorflow DenseNet 論文源碼實現,寫的最好的還是這篇,這篇將DenseNet-BC考慮進去了,所有的tensorflow實現中所有的block的層數都相同,所以如果你發現了不要困惑,因為非ImageNet數據集都使用這種方式,這也許給了我們一些啟示,如果你做遷移學習的時候,類別並不是很多,圖像也不是很複雜,那就完全沒有必要使用上面的複雜結構。我測試了MINST數據集,2個block,效果能達到98%,還真是令人吃驚不是嗎?點擊下載論文
總結
覺得很有必要一起研讀網路實現源碼,從中體會到更特別的感觸,總的來說DenseNet的網路實現,還是比較簡單的,與Inception不同,inception不僅要考慮分支,還要考慮輔助節點,確實很複雜,與ResNet搭建一樣簡單,封裝好block之後就可以happy的搬磚了,遺憾的是我並沒有找到DenseNet已經訓練好的模型參數,如果有模型參數的話可能幾次epoch就能收斂到不錯的效果。下面是整個網路的構建過程,邏輯比較清晰沒有複雜的結構,點擊我查看DenseNet源碼。如果還比較困惑可以對照著論文,一目了然,本人能力有限,如果有瑕疵請指出,歡迎與我討論學習
TAG:Microlearner |