Feature Extractor[DenseNet]
0.背景
隨著CNN變得越來越深,人們發現會有梯度消失的現象。這個問題主要是單路徑的信息和梯度的傳播,其中的激活函數都是非線性的,從而特別是乘法就可以使得隨著層數越深,假設將傳統的神經網絡的每一層看成是自動機中的一個狀態。那么對于整個神經網絡來說,輸入到輸出就是一個輸入態不斷的轉移到輸出態的一個過程。假設其中每一層都是有個變率,即縮放因子。那么:
- 變率大于1,層數越多,越呈現倍數放大趨勢,比如爆炸;
- 變率小于1,層數越多,越呈現倍數縮小趨勢,比如消失;
而傳統以往的卷積神經網絡都是單路徑的,即從輸入到輸出只能走一條路,所以人們發現了可以通過擴展信息的傳輸路徑和形式,如:
- inception系列從模塊入手,基于每個模塊建立多個不同的通道,然后將模塊進行連接,不過從模型整體角度上看也是一本道;
- ResNet系列通過快捷連接的方式將不同層的輸出直接連接到后面層的輸入,算是讓信息的傳播通道有了分支,不完全直接走非線性的卷積和池化等權重層,讓信息的傳播路徑有了選擇。
正是發現可以從網絡結構入手,讓信息的傳輸路徑不再單一。假如我們認為傳統的神經網絡的輸入到輸出是單路徑形式,那么通過添加分支路徑使得某些層能夠比傳統模型有更多更短的路徑可以選擇,這樣較好的解決了唯一路徑的"瓶頸問題"(信息只有一條路可走),從而通過網絡訓練,信息能夠自適應的走網絡的多個路徑。不過近期很多的論文,如ResNet和Highway Network等都是通過恒等連接將某層的輸出信息傳遞到后面其他層,且而《Deep networks with stochastic depth》在Resnet網絡結構上發現其實很多層的信息是冗余的,通過在訓練過程中隨機丟棄某些層可以得到更好的信息和梯度流。
DenseNet由此出發,建立了更復雜的多通道模型,如圖0.1所示,輸入層可以快捷連接到輸出層:
圖0.1 Densenet的模塊結構
如圖0.1,這就是Densenet的模塊結構。作者認為好處有:
- 緩和了梯度消失的問題(多路徑帶來的好處);
- 增強了特征傳播(多路徑帶來的好處);
- 特征能夠多次重用,從而減少冗余特征的學習;
- 模型參數量能夠很大程度上的減少;
- 模型具有正則效果(在很小的數據集上減少過擬合)
如圖0.1所示,Densenet在將特征連入后面的層之前,不對其做任何操作,只是將其以通道的維度進行合并(如第\(l\)層有\(l\)個通道輸入,那么結合之前所有的卷積層,這時候的通道數變成了\(l(l+1)/2\)).
值得注意的是,通過實驗發現,這樣一個相對更密集的網絡結構,所需要的參數量反而更少,這歸功于densenet不需要去保留那些冗余的feature map。
1. DenseNet
基于上述自動機的角度,傳統的前向網絡結構可以認為是:當前層從前一層獲取狀態,然后加以處理,并將新的狀態輸出到下一層。這其中就會發現有些信息其實是需要保留到當前層的,結果也傳遞到后面去了,造成了冗余。接著從自動機角度出發,Resnet也可以看成是一個“相似的鋪展開的RNN網絡結構”(通過恒等連接實現循環),不過不同于RNN的就是resnet的參數量因為每一層都是有各自的參數,所以相比RNN的參數量要大很多。
為了防止參數量過大,且主要是基于特征重用。densenet設計的時候是讓每一層的通道數量很小(一層12個通道),且如0.1圖所示,后續每一層都能直接獲取前面所有層的特征,最后的分類器可以基于所有的feature map進行做決策,這樣讓特定層的特征能夠一直重用,從而減少網絡的冗余特征學習。
用數學形式來說明ResNet與Densenet的差別如下:
- ResNet: \(x_l = H_l(x_{l-1})+x_{l-1}\)
- DenseNet: \(x_l = H_l([x_0,x_1,...,x_{l-1}])\)
其中\([x_0,x_1,...,x_{l-1}]\)就是將之前的feature map以通道的維度進行合并,且受到ResNet v2的影響,其中的\(H_l(\dot)\)也是三層網絡:BN、ReLU、卷積。
如上面所述,在進行feature map合并的時候,是沒法處理feature map的size不同的情況的,可是CNN是必須要有map的size的減小的,也就是池化還是需要的,不然輸出層會參數量過多了。所以作者通過圖1.1形式來解決這個問題。
圖1.1 將圖0.1結構作為densenet的塊來構建整個網絡
圖1.2 基于imagenet上的實驗結果
如圖1.1。通過將圖0.1的結構作為一個構建塊,從而在不同的構建塊之間建立轉換層,從而解決feature map需要變化的問題(其中連接層由:BN層,\(1*1\)卷積層,\(2*2\)池化層構成,其中BN未畫出來)(那么,這樣是不是說在池化部分,就有瓶頸存在了呢?)
1.1 增長參數k
對于圖0.1來說,假定每一層的feature maps的個數為k,則第\(l\)層的輸入map個數為\(k_0+k*(l-1)\),即收集之前每層輸出的feature maps,然后基于通道維度進行合并,以此作為當前層的輸入feature maps。那么k值的大小就能控制網絡的復雜度了,作者將該變量稱為網絡的"growth rate"
1.2 DenseNet-B
對于DenseNet-B來說,就是將之前densenet的構建塊中的BN-ReLU-(\(3*3\)卷積)變成BN-ReLU-(\(1*1\)卷積),并且對于其中的(\(1*1\)卷積),輸出的feature maps的通道數為4k個
1.3 DenseNet-C
對于Densenet-C來說,就是在轉換層下功夫了,如圖1.1中的兩個Dense block中間的部分,如果上一個Dense block輸出了m個feature maps(即將之前所有的feature map都連接到這個轉換層),那么設定一個縮放因子\(\theta\),如果\(0<\theta<1\),那么就達到了網絡通道上的降維,使得模型更緊湊,實驗中該值設為0.5。
2 實現過程
- 1 - 作者在imagenet數據集上用個4個dense block,結構如下圖
圖2.1 k等于32基礎上,不同層數densenet網絡的結構
2 - 在其他數據集上是用了三個dense block(每個block中層數相同),轉換層是\(1*1\)的卷積加上\(2*2\)的平均池化,在最后一個dense block后面跟上一個全局平均池化,然后是一個softmax。
其中三個dense block中feature map的大小分別是\(32*32\),\(16*16\),\(8*8\),且有三個不同的參數組合:- 對于簡單的densenet來說有(L=40,k=12)、(L=100,k=12)、(L=100,k=24);
- 對于densenet-BC來說有(L=100,k=12)、(L=250,k=24)、(L=190,k=40)
圖2.2 其他數據集下的實驗對比
總結
以上是生活随笔為你收集整理的Feature Extractor[DenseNet]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据泄漏防御在企业的应用
- 下一篇: Introduction or Why