【深度學習】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做迴歸中進行了說明。
標準的卷積層將一個的tensor,通過size爲的卷積核,輸出一個的tensor,需要的計算成本爲:,而同樣size的輸入輸出,深度可分離卷積的計算成本爲:
Inverted residual block
Inverted residual block的結構如上圖所示,當深度可分離卷積中的深度卷積部分(圖中Dwise)步長不爲1的時候,不加shortcut connection。另外,當expansion ratio爲1的時候,去掉最接近input的那個的卷積層。
Inverted:倒置的,這個block叫倒置殘差的原因,是殘差網絡的結構是通過的卷積將tensor的channel降低,通過的卷積後,再通過的卷積將tensor的channel提高,而Inverted residual block的通過的卷積將tensor的channel提高(expansion ratio,也就是上表中的t,大於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激活函數公式爲:
默認爲
EfficientNet的網絡scale up策略
卷積神經網絡有三個scale up網絡規模的維度:
- :如上圖,通過增加baseline的channel向維度,對網絡規模scale up。的網絡能夠捕獲更加細粒度的特徵,而且訓練更容易。
- :如上圖,通過增加baseline的深度,也就是增加捲積層的數量,對網絡規模scale up。的網絡能夠捕獲更豐富、更復雜的特徵,但是由於梯度彌散、梯度爆炸等問題,訓練難度較大。
- :如上圖,通過增加baseline輸入image的分辨率,對網絡規模scale up。 的網絡能夠捕獲更加細粒度的特徵。
EfficientNet的網絡scale up策略是:因爲如果圖像的分辨率更大,就需要更深的網絡來提高感受野,需要更多的channel數來捕獲更加細粒度的特徵,因此:通過一個固定的比例對和同時進行scale up,實現一個卷積神經網絡中三者的平衡。也就是如上圖。
scale up策略
一個卷積層可以看作一個函數:
,是卷積操作,是輸出tensor,是輸入tensor,的shape爲
因此一個卷積神經網絡可以看作一個函數:
因爲卷積神經網絡可以視爲幾個stage的組合,每個stage重複不同的次數,而每個相同的stage的重複block都有相同的結構,所以卷積神經網絡的函數可以定義如下:
是stage的索引,的含義是block重複次,,、表示索引爲的stage的輸入tensor的height和width方向的size,表示輸出tensor的channel數。
上述中卷積神經網絡的三個scale up網絡規模的維度,對應於增大,對應於增大,對應於增大。
這裏規定一個卷積神經網絡,所有的block都按相同的比例對三個維度進行scale up,因此,scale up的優化目標可以定義爲:
也就是在baseline的基礎上,給定對卷積神經網絡進行scale up,讓scale up後的卷積神經網絡的性能最優。
三個維度的scale up係數的確定方法:
約束條件:
其中,是通過grid search得到的常數,是根據計算資源的大小設置的常數。
對於EfficientNet-B0的baseline網絡,固定爲1,通過grid search得到、、,時,scale up的卷積神經網絡性能最優,得到EfficientNet-B0。
固定、、,通過設置不同的值,對EfficientNet-B0的baseline網絡進行scale up,進而得到EfficientNet-B1到EfficientNet-B7。
如果直接在規模更大的baseline上進行grid search得到、和,會得到性能更優的卷積神經網絡,但是grid search需要的計算成本更大,因此,這裏在小的baseline上進行grid search,然後通過修改的值,對網絡進行scale up得到規模更大的卷積神經網絡。
結語
如果您有修改意見或問題,歡迎留言或者通過郵箱和我聯繫。
手打很辛苦,如果我的文章對您有幫助,轉載請註明出處。