经典网络DenseNet介绍
經典網絡DenseNet(Dense Convolutional Network)由Gao Huang等人于2017年提出,論文名為:《Densely Connected Convolutional Networks》,論文見:https://arxiv.org/pdf/1608.06993.pdf
DenseNet以前饋的方式(feed-forward fashion)將每個層與其它層連接起來。在傳統卷積神經網絡中,對于L層的網絡具有L個連接,而在DenseNet中,會有L(L+1)/2個連接。每一層的輸入來自前面所有層的輸出。
DenseNet網絡:
(1).減輕梯度消失(vanishing-gradient)。
(2).加強feature傳遞。
(3).鼓勵特征重用(encourage feature reuse)。
(4).較少的參數數量。
Dense Block:像GoogLeNet網絡由Inception模塊組成、ResNet網絡由殘差塊(Residual Building Block)組成一樣,DenseNet網絡由Dense Block組成,論文截圖如下所示:每個層從前面的所有層獲得額外的輸入,并將自己的特征映射傳遞到后續的所有層,使用級聯(Concatenation)方式,每一層都在接受來自前幾層的”集體知識(collective knowledge)”。增長率(growth rate)是每個層的額外通道數。
Growth rate:如果每個函數產生個feature-maps,那么第層產生個feature-maps。是輸入層的通道數。將超參數稱為網絡的增長率。
DenseNet Basic Composition Layer:BatchNorm(BN)-ReLu-3*3 Conv
DenseNet-B(Bottleneck Layers):在BN-ReLu-3*3 Conv之前進行BN-ReLU-1*1 Conv操作,減少feature maps size。
Transition Layer(過渡層):采用1*1 Conv和2*2平均池化作為相鄰Dense Block之間的轉換層,減少feature map數和縮小feature map size,size指width*height。在相鄰Dense Block中輸出的feature map size是相同的,以便它們能夠很容易的連接在一起。
DenseNet-BC:如果Dense Block包含個feature-maps,則Transition Layer生成輸出feature maps,其中<img src="https://img.api-racing.com/2023/02/20230214101956328.png" title="" alt="0<\theta <img onload="Wpfcll.r(this,true);" src="https://javaforall.cn/wp-content/plugins/wp-fastest-cache-premium/pro/images/blank.gif" class="j-lazy" data-wpfc-original-src="http://javaforall.cn/wp-content/uploads/2020/11/2020110816061913.jpg" data-original="https://img.api-racing.com/2023/02/20230214101956328.png" title="" alt="0<\theta 稱為壓縮因子。當時,通過Transition Layers的feature-maps數保持不變。當<img src="https://img.api-racing.com/2023/02/20230214101956328.png" title="" alt="\theta <img onload="Wpfcll.r(this,true);" src="https://javaforall.cn/wp-content/plugins/wp-fastest-cache-premium/pro/images/blank.gif" class="j-lazy" data-wpfc-original-src="http://javaforall.cn/wp-content/uploads/2020/11/2020110816061913.jpg" data-original="https://img.api-racing.com/2023/02/20230214101956328.png" title="" alt="\theta 時,稱為DenseNet-C,在實驗中。當同時使用Bottleneck和<img src="https://img.api-racing.com/2023/02/20230214101956328.png" title="" alt="\theta <img onload="Wpfcll.r(this,true);" src="https://javaforall.cn/wp-content/plugins/wp-fastest-cache-premium/pro/images/blank.gif" class="j-lazy" data-wpfc-original-src="http://javaforall.cn/wp-content/uploads/2020/11/2020110816061913.jpg" data-original="https://img.api-racing.com/2023/02/20230214101956328.png" title="" alt="\theta 的Transition Layers時,稱為DenseNet-BC。
下圖是一個DenseNet結構圖,來自于論文:使用了3個Dense Blocks。DenseNet由多個Desne Block組成。每個Dense Block中的feature-map size相同。兩個相鄰Dense Block之間的層稱為Transition Layers。通過卷積和池化來更改feature-map size。
論文中給出了4種層數的DenseNet,論文截圖如下所示:所有網絡的增長率是32,表示每個Dense Block中每層輸出的feature map個數。
DenseNet-121、DenseNet-169等中的數字121、169是如何計算出來的:以121為例,1個卷積(Convolution)+6個Dense Block*2個卷積(1*1、3*3)+1個Transition Layer(1*1 conv)+12個Dense Block*2個卷積(1*1、3*3)+ 1個Transition Layer(1*1 conv)+24個Dense Block*2個卷積(1*1、3*3)+ 1個Transition Layer(1*1 conv)+ 16個Dense Block*2個卷積(1*1、3*3)+最后的1個全連接層=121。這里的層僅指卷積層和全連接層,其它類型的層并沒有計算在內
公式表示:其中表示非線性轉換函數
(1).傳統的網絡在層的輸出為:
(2).ResNet在l層的輸出為:
(3).DenseNet在l層的輸出為:
假如輸入圖像大小為n*n,過濾器(filter)為f*f,padding為p,步長(stride)為s,則輸出大小為:計算卷積層大小,如果商不是整數,向下取整,即floor函數;計算池化層大小,如果商不是整數,向上取整,即ceil函數。參考:https://blog.csdn.net/fengbingchun/article/details/80262495
在https://github.com/fengbingchun/Caffe_Test/tree/master/test_data/Net/DenseNet 上整理了DenseNet prototxt文件。
這里描述下DenseNet-121架構:k=32,與上表中”DenseNet-121″有所差異
(1).輸入層(Input):圖像大小為224*224*3。
(2).卷積層Convolution+BatchNorm+Scale+ReLU:使用64個7*7的filter,stride為2,padding為3,輸出為112*112*64,64個feature maps。
(3).Pooling:最大池化,filter為3*3,stride為2,padding為1,輸出為57*57*64,64個feature maps。
(4).Dense Block1:輸出為57*57*(64+32*6)=57*57*256,256個feature maps。
連續6個Dense Block,每個Dense Block包含2層卷積,卷積kernel大小依次為1*1、3*3,在卷積前進行BatchNorm+Scale+ReLU操作,第1、2個卷積輸出feature maps分別為128、32。因為k=32,所以每個Dense Block輸出feature maps數會比上一個Dense Block多32。每個Dense Block后做Concat操作。
(5).Transition Layer1:輸出為29*29*128,128個feature maps。
A.BatchNorm+Scale+ReLU+1*1 conv,輸出57*57*128。
B.平均池化,filter為2*2,stride為2,輸出29*29*128。
(6).Dense Block2:輸出為29*29*(128+32*12)=29*29*512,512個feature maps。
連續12個Dense Block,每個Dense Block包含2層卷積,卷積kernel大小依次為1*1、3*3,在卷積前進行BatchNorm+Scale+ReLU操作,第1、2個卷積輸出feature maps分別為128、32。因為k=32,所以每個Dense Block輸出feature maps數會比上一個Dense Block多32。每個Dense Block后做Concat操作。
(7).Transition Layer2:輸出為15*15*256,256個feature maps。
A.BatchNorm+Scale+ReLU+1*1 conv,輸出29*29*256。
B.平均池化,filter為2*2,stride為2,輸出15*15*256。
(8).Dense Block3:輸出為15*15*(256+32*24)=15*15*1024,1024個feature maps。
連續24個Dense Block,每個Dense Block包含2層卷積,卷積kernel大小依次為1*1、3*3,在卷積前進行BatchNorm+Scale+ReLU操作,第1、2個卷積輸出feature maps分別為128、32。因為k=32,所以每個Dense Block輸出feature maps數會比上一個Dense Block多32。每個Dense Block后做Concat操作。
(9).Transition Layer3:輸出為8*8*512,512個feature maps。
A.BatchNorm+Scale+ReLU+1*1 conv,輸出15*15*512。
B.平均池化,filter為2*2,stride為2,輸出8*8*512。
(10).Dense Block4:輸出為8*8*(512+32*16)=8*8*1024,1024個feature maps。
連續16個Dense Block,每個Dense Block包含2層卷積,卷積kernel大小依次為1*1、3*3,在卷積前進行BatchNorm+Scale+ReLU操作,第1、2個卷積輸出feature maps分別為128、32。因為k=32,所以每個Dense Block輸出feature maps數會比上一個Dense Block多32。每個Dense Block后做Concat操作。
(11).Classification Layer:
A.平均池化:filter為8*8,stride為1,padding為0,輸出為1*1*1024,1024個feature maps。
B.卷積:kernel大小為1*1,輸出1000個feature maps。
C.輸出層(Softmax):輸出分類結果,看它究竟是1000個可能類別中的哪一個。
可視化結果如下圖所示:
GitHub:https://github.com/fengbingchun/NN_Test
總結
以上是生活随笔為你收集整理的经典网络DenseNet介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: matlab中的ezplot函数(Mat
- 下一篇: 独家:知情人士称小米汽车接近获得新能源汽