博客專欄

EEPW首頁 > 博客 > 超越MobileNetV3的輕量級網絡

超越MobileNetV3的輕量級網絡

發(fā)布人:CV研究院 時間:2021-11-10 來源:工程師 發(fā)布文章

1.jpg

之前CVPR公布了收錄的文章,“計算機視覺研究院”從其中找一些好的算法框架與大家分享,今天分享的就是超越Mobilenet_V3的輕量級網絡——GhostNet。

雖然說mobileNet或者是shuffleNet提出了使用depthwise或者是shuffle等操作,但是引入的1x1卷積依然會產生一定的計算量。

為什么1x1依然會產生較大的計算量?

看卷積計算量的計算公式n?h?w?c?k?kn*h*w*c*k*kn?h?w?c?k?k,可以發(fā)現,由于c和n都是比較大的,所以會導致這個計算量也是比較大的,但是作者在分析輸出的特征圖的時候發(fā)現,其實有些特征圖是比較相似的。

Introduction

目前,神經網絡的研究趨向于移動設備上的應用,一些研究著重于模型的壓縮方法,比如剪枝,量化,知識蒸餾等,另外一些則著重于高效的網絡設計,比如MobileNet,ShuffleNet等。作者在分析輸出的特征圖的時候發(fā)現,其實有些特征圖是比較相似的,如下圖所示,作者認為可以通過簡單的變換得到。

2.jpg

訓練好的網絡一般都有豐富甚至冗余的特征圖信息來保證對輸入的理解,如上圖ResNet-50的特征圖,相似的特征圖類似于對方的ghost。冗余的特征是網絡的關鍵特性,論文認為與其避免冗余特征,不如以一種cost-efficient的方式接受,獲得很不錯的性能提升,論文主要有兩個貢獻:

· 提出能用更少參數提取更多特征的Ghost模塊,首先使用輸出很少的原始卷積操作(非卷積層操作)進行輸出,再對輸出使用一系列簡單的線性操作來生成更多的特征。這樣,不用改變其輸出的特征圖,Ghost模塊的整體的參數量和計算量就已經降低了;

· 基于Ghost模塊提出GhostNet,將原始的卷積層替換為Ghost模塊。

基于此,作者得到啟發(fā),是不是每張圖都需要用這么大的計算量去得到?是否可以通過cheap transformation得到這些相似的特征圖?

然后就出現了GhostNet。Ghost就是說相似的特征圖,猶如另一個的幽靈,可以通過簡單的線性變換得到。

3.jpg

Ghost Module for More Features

4.png

對于輸入數據X∈?c×h×w,卷積層操作如上公式,Y∈?h′×w′×n為輸出的n維特征圖,f∈?c×k×k×nf為該層的卷積核,可得該層的計算量為n?h′?w′?c?k?k,這個結果一般較大,是由于n和c一般都很大。上面公式的參數量與輸入和輸出的特征圖數息息相關,而從圖1可以看出中間特征圖存在大量冗余,且存在相似的特征(Ghost),所以完全沒必要占用大量計算量來計算這些Ghost。

假設原輸出的特征為某些內在特征進行簡單的變換得到Ghost,通常這些內在特征數量都很少,并且能通過原始卷積操作如下公式獲得,Y′∈?h′×w′×m為原始卷積輸出,f′∈?c×k×k×m為使用的卷積核,m≤n,bias直接簡化了:

5.png

為了獲得原來的n維特征,對Y′的內在特征分別使用一系列簡單線性操作來產生s維ghost特征,Φi,j為生成y′i的j-th ghost特征圖的線性變換函數,最后的Φi,s為保存內在特征的identity mapping,整體計算如上圖2b。

簡單的來說就是:

首先,假設我們輸入特征圖的尺寸是h*w*c,輸出特征圖的尺寸是h’*w’*n,卷積核大小為k*k。

在cheap operation變換中,我們假設特征圖的channel是m,變換的數量是s,最終得到的新的特征圖的數量是n,那么我們可以得到等式:

n=m?sn = m * s

n=m?s

由于Ghost的變換過程中最后存在一個恒等變換(Identity),所以實際有效的變換數量是s-1,所以上式可以得到如下公式:

m?(s?1)=n/s?(s?1)m * (s-1) = n/s * (s-1)

m?(s?1)=n/s?(s?1)

所以我們便可以計算得到如下結果:

6.png

當然這里還有一個條件:m << n

通過這么分析,可以體會到,其實GhostNet的方法也很簡單,無外乎就是將原本的乘法變成了兩個乘法相加,然后在代碼實現中,其實第二個變換是用depthwise conv實現的。作者在文中也提到,前面的卷積使用pointwise效率比較高,所以網絡嫣然類似一個mobilenet的反過來的版本,只不過GhostNet采用了拼接的方式,進一步減少了計算量。

Ghost module的pytorch代碼如下:

class GhostModule(nn.Module):
    def __init__(self, inp, oup, kernel_size=1, ratio=2, dw_size=3, stride=1, relu=True):
        super(GhostModule, self).__init__()
        self.oup = oup
        init_channels = math.ceil(oup / ratio)
        new_channels = init_channels*(ratio-1)
        self.primary_conv = nn.Sequential(
            nn.Conv2d(inp, init_channels, kernel_size, stride, kernel_size//2, bias=False),
            nn.BatchNorm2d(init_channels),
            nn.ReLU(inplace=True) if relu else nn.Sequential(),
        )
        self.cheap_operation = nn.Sequential(
            nn.Conv2d(init_channels, new_channels, dw_size, 1, dw_size//2, groups=init_channels, bias=False),
            nn.BatchNorm2d(new_channels),
            nn.ReLU(inplace=True) if relu else nn.Sequential(),
        )
    def forward(self, x):
        x1 = self.primary_conv(x)
        x2 = self.cheap_operation(x1)
        out = torch.cat([x1,x2], dim=1)
        return out[:,:self.oup,:,:]

與現有網絡的不同

與目前主流的卷積操作對比,Ghost模塊有以下不同點:

對比Mobilenet、Squeezenet和Shufflenet中大量使用1×1pointwise卷積,Ghost模塊的原始卷積可以自定義卷積核數量;

目前大多數方法都是先做pointwise卷積降維,再用depthwise卷積進行特征提取,而Ghost則是先做原始卷積,再用簡單的線性變換來獲取更多特征;

目前的方法中處理每個特征圖大都使用depthwise卷積或shift操作,而Ghost模塊使用線性變換,可以有很大的多樣性;

Ghost模塊同時使用identity mapping來保持原有特征。

框架結構

下圖是Ghost bottleneck結構圖,很類似resnet結構,不同的是channel是先升維再降維。

7.jpgGhost Bottleneck(G-bneck)與residual block類似,主要由兩個Ghost模塊堆疊二次,第一個模塊用于增加特征維度,增大的比例稱為expansion ration,而第二個模塊則用于減少特征維度,使其與shortcut一致。

G-bneck包含stride=1和stride=2版本,對于stride=2,shortcut路徑使用下采樣層,并在Ghost模塊中間插入stride=2的depthwise卷積。為了加速,Ghost模塊的原始卷積均采用pointwise卷積。

下面是GhostNet的網絡結構圖,可以看到channel控制的比較小,并且引入了SE結構。

8.jpg

實驗

作者首先采用控制變量法,測試不同的s以及d的效果。經過測試發(fā)現在s=2,d=3的情況下模型表現較好。

9.png10.png

下表為在resnet50實驗的不同網絡的壓縮比例以及精度對比:

11.jpg

可以看到使用Ghost模塊不僅比其它壓縮方法更能降低模型的體量,也最能保持模型準確率:

12.jpg

The feature maps in the 2nd layer of Ghost-VGG-16. The left-top image is the input, the feature maps in the left red box are from the primary convolution, and the feature maps in the right green box are after the depthwise transformation.

13.jpg14.jpg

ImageNet效果對比:

15.jpg16.jpg

目標檢測的效果:

17.jpg

小結

為了減少神經網絡的計算消耗,論文提出Ghost模塊來構建高效的網絡結果。該模塊將原始的卷積層分成兩部分,先使用更少的卷積核來生成少量內在特征圖,然后通過簡單的線性變化操作來進一步高效地生成ghost特征圖。從實驗來看,對比其它模型,GhostNet的壓縮效果最好,且準確率保持也很不錯,論文思想十分值得參考與學習。

論文地址:https://arxiv.org/pdf/1911.11907.pdf

*博客內容為網友個人發(fā)布,僅代表博主個人觀點,如有侵權請聯(lián)系工作人員刪除。

電子管相關文章:電子管原理




關鍵詞: AI

相關推薦

技術專區(qū)

關閉