【深度學習】EfficientNet系列網絡結構

pytorch實現的EfficientNet

https://github.com/lukemelas/EfficientNet-PyTorch

安裝:

git clone https://github.com/lukemelas/EfficientNet-PyTorch
cd EfficientNet-Pytorch
sudo pip3 install -e .

MobileNetV2和Inverted residual block

深度可分離卷積

深度可分離卷積通過將乘法運算變爲加法運算,使得在能夠保證卷積精度的情況下,極大的降低運算成本。
深度可分離卷積的計算原理在【深度學習】用caffe+ShuffleNet-V2做迴歸中進行了說明。

標準的卷積層將一個hi×wi×dih_i ×w_i ×d_i的tensor,通過size爲k×kk ×k的卷積核,輸出一個hi×wi×djh_i × w_i × d_j的tensor,需要的計算成本爲:k×k×di×hi×wi×djk×k×d_i×h_i ×w_i × d_j,而同樣size的輸入輸出,深度可分離卷積的計算成本爲:k×k×1×hi×wi×di+1×1×di×hi×wi×dj=hi×wi×di×(k2+dj)k×k×1×h_i×w_i×d_i +1×1×d_i×h_i×w_i×d_j=h_i×w_i×d_i×(k^2+d_j)

Inverted residual block

在這裏插入圖片描述 Inverted residual block的結構如上圖所示,當深度可分離卷積中的深度卷積部分(圖中Dwise)步長不爲1的時候,不加shortcut connection。另外,當expansion ratio爲1的時候,去掉最接近input的那個111*1的卷積層。
在這裏插入圖片描述Inverted:倒置的,這個block叫倒置殘差的原因,是殘差網絡的結構是通過111*1的卷積將tensor的channel降低,通過333*3的卷積後,再通過111*1的卷積將tensor的channel提高,而Inverted residual block的通過111*1的卷積將tensor的channel提高(expansion ratio,也就是上表中的t,大於1),通過333*3的卷積後,再通過111*1的卷積將tensor的channel降低。

ReLU6激活函數

ReLU6就是普通的ReLU但是限制最大輸出值爲6(對輸出值做clip),這是爲了在移動端設備float16的低精度的時候,也能有很好的數值分辨率,如果對ReLU的激活範圍不加限制,輸出範圍爲0到正無窮,如果激活值非常大,分佈在一個很大的範圍內,則低精度的float16無法很好地精確描述如此大範圍的數值,帶來精度損失。

MobileNetV2網絡結構

在這裏插入圖片描述MobileNetV2的網絡結構,t是Inverted residual block的expansion ratio,c是輸出tensor的channel,n是block重複的次數,s是卷積步長。注意MobileNetV2對輸入tensor進行了32倍下采樣,是全卷積網絡。

EfficientNet-B0的baseline網絡結構

在這裏插入圖片描述EfficientNet-B0的baseline網絡結構如圖所示,Resolution是輸入tensor的size,#Channels是輸出tensor的channel,#Layers是block重複的次數。MBConv的網絡結構和MobileNetV2的Inverted residual block相同,例如:MBConv6,k3×3代表,t爲6,深度卷積的卷積核尺寸爲3×3。

不同之處在於,EfficientNet-B0將ReLU6激活函數換成了Swish激活函數。另外,可以選擇使用squeeze-and-excitation優化。

Swish激活函數

Swish激活函數公式爲:f(x)=xsigmoid(βx)f(x)=x*sigmoid({\beta}x)
在這裏插入圖片描述β\beta默認爲1.01.0

EfficientNet的網絡scale up策略

在這裏插入圖片描述卷積神經網絡有三個scale up網絡規模的維度:

  • widthwwidth——w:如上圖(b)(b)通過增加baseline的channel向維度,對網絡規模scale up。widerwider的網絡能夠捕獲更加細粒度的特徵,而且訓練更容易
  • depthddepth——d:如上圖(c)(c)通過增加baseline的深度,也就是增加捲積層的數量,對網絡規模scale up。deeperdeeper的網絡能夠捕獲更豐富、更復雜的特徵,但是由於梯度彌散、梯度爆炸等問題,訓練難度較大
  • resolutionrresolution——r:如上圖(d)(d)通過增加baseline輸入image的分辨率,對網絡規模scale up。higherhigher resolutionresolution的網絡能夠捕獲更加細粒度的特徵

EfficientNet的網絡scale up策略是:因爲如果圖像的分辨率更大,就需要更深的網絡來提高感受野,需要更多的channel數來捕獲更加細粒度的特徵,因此:通過一個固定的比例對widthdepthwidth、depthresolutionresolution同時進行scale up,實現一個卷積神經網絡中三者的平衡。也就是如上圖(e)(e)

scale up策略

一個卷積層可以看作一個函數:
Yi=Fi(Xi)Y_i=F_i(X_i)FiF_i是卷積操作,YiY_i是輸出tensor,XiX_i是輸入tensor,XiX_i的shape爲<Hi,Wi,Ci><H_i, W_i, C_i>

因此一個卷積神經網絡NN可以看作一個函數:
在這裏插入圖片描述
因爲卷積神經網絡可以視爲幾個stage的組合,每個stage重複不同的次數,而每個相同的stage的重複block都有相同的結構,所以卷積神經網絡的函數可以定義如下:
在這裏插入圖片描述
ii是stage的索引,FiLi{F_i}^{L_i}的含義是blockFiF_i重複LiL_i次,<Hi,Wi,Ci><H_i, W_i, C_i>HiH_iWiW_i表示索引爲ii的stage的輸入tensor的height和width方向的size,CiC_i表示輸出tensor的channel數。

上述中卷積神經網絡的三個scale up網絡規模的維度,widthwidth對應於增大CiC_idepthdepth對應於增大LiL_iresolutionresolution對應於增大<Hi,Wi><H_i, W_i>

這裏規定一個卷積神經網絡,所有的block都按相同的比例對三個維度進行scale up,因此,scale up的優化目標可以定義爲:
在這裏插入圖片描述
也就是在baseline的基礎上,給定d,w,rd,w,r對卷積神經網絡進行scale up,讓scale up後的卷積神經網絡的性能最優

widthdepthresolutionwidth、depth、resolution三個維度的scale up係數的確定方法:

  1. depth:d=αϕdepth:d={\alpha}^{\phi}
  2. width:w=βϕwidth:w={\beta}^{\phi}
  3. resolution:r=γϕresolution:r={\gamma}^{\phi}

約束條件:

  • αβ2γ22{\alpha}*{\beta}^2*{\gamma}^2約等於2
  • αβγ1\alpha、\beta、\gamma都不小於1

其中,αβγ\alpha、\beta、\gamma是通過grid search得到的常數,ϕ\phi是根據計算資源的大小設置的常數。

對於EfficientNet-B0的baseline網絡,固定ϕ\phi爲1,通過grid search得到α=1.2\alpha=1.2β=1.1\beta=1.1γ=1.15\gamma=1.15,時,scale up的卷積神經網絡性能最優,得到EfficientNet-B0。

固定α=1.2\alpha=1.2β=1.1\beta=1.1γ=1.15\gamma=1.15,通過設置不同的ϕ\phi值,對EfficientNet-B0的baseline網絡進行scale up,進而得到EfficientNet-B1到EfficientNet-B7。

如果直接在規模更大的baseline上進行grid search得到α\alphaβ\betaγ\gamma,會得到性能更優的卷積神經網絡,但是grid search需要的計算成本更大,因此,這裏在小的baseline上進行grid search,然後通過修改ϕ\phi的值,對網絡進行scale up得到規模更大的卷積神經網絡

結語

如果您有修改意見或問題,歡迎留言或者通過郵箱和我聯繫。
手打很辛苦,如果我的文章對您有幫助,轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章