超越MobileNetV3的輕量級(jí)網(wǎng)絡(luò)
之前CVPR公布了收錄的文章,“計(jì)算機(jī)視覺(jué)研究院”從其中找一些好的算法框架與大家分享,今天分享的就是超越Mobilenet_V3的輕量級(jí)網(wǎng)絡(luò)——GhostNet。
雖然說(shuō)mobileNet或者是shuffleNet提出了使用depthwise或者是shuffle等操作,但是引入的1x1卷積依然會(huì)產(chǎn)生一定的計(jì)算量。
為什么1x1依然會(huì)產(chǎn)生較大的計(jì)算量?
看卷積計(jì)算量的計(jì)算公式n?h?w?c?k?kn*h*w*c*k*kn?h?w?c?k?k,可以發(fā)現(xiàn),由于c和n都是比較大的,所以會(huì)導(dǎo)致這個(gè)計(jì)算量也是比較大的,但是作者在分析輸出的特征圖的時(shí)候發(fā)現(xiàn),其實(shí)有些特征圖是比較相似的。
Introduction
目前,神經(jīng)網(wǎng)絡(luò)的研究趨向于移動(dòng)設(shè)備上的應(yīng)用,一些研究著重于模型的壓縮方法,比如剪枝,量化,知識(shí)蒸餾等,另外一些則著重于高效的網(wǎng)絡(luò)設(shè)計(jì),比如MobileNet,ShuffleNet等。作者在分析輸出的特征圖的時(shí)候發(fā)現(xiàn),其實(shí)有些特征圖是比較相似的,如下圖所示,作者認(rèn)為可以通過(guò)簡(jiǎn)單的變換得到。
訓(xùn)練好的網(wǎng)絡(luò)一般都有豐富甚至冗余的特征圖信息來(lái)保證對(duì)輸入的理解,如上圖ResNet-50的特征圖,相似的特征圖類似于對(duì)方的ghost。冗余的特征是網(wǎng)絡(luò)的關(guān)鍵特性,論文認(rèn)為與其避免冗余特征,不如以一種cost-efficient的方式接受,獲得很不錯(cuò)的性能提升,論文主要有兩個(gè)貢獻(xiàn):
· 提出能用更少參數(shù)提取更多特征的Ghost模塊,首先使用輸出很少的原始卷積操作(非卷積層操作)進(jìn)行輸出,再對(duì)輸出使用一系列簡(jiǎn)單的線性操作來(lái)生成更多的特征。這樣,不用改變其輸出的特征圖,Ghost模塊的整體的參數(shù)量和計(jì)算量就已經(jīng)降低了;
· 基于Ghost模塊提出GhostNet,將原始的卷積層替換為Ghost模塊。
基于此,作者得到啟發(fā),是不是每張圖都需要用這么大的計(jì)算量去得到?是否可以通過(guò)cheap transformation得到這些相似的特征圖?
然后就出現(xiàn)了GhostNet。Ghost就是說(shuō)相似的特征圖,猶如另一個(gè)的幽靈,可以通過(guò)簡(jiǎn)單的線性變換得到。
Ghost Module for More Features
對(duì)于輸入數(shù)據(jù)X∈?c×h×w,卷積層操作如上公式,Y∈?h′×w′×n為輸出的n維特征圖,f∈?c×k×k×nf為該層的卷積核,可得該層的計(jì)算量為n?h′?w′?c?k?k,這個(gè)結(jié)果一般較大,是由于n和c一般都很大。上面公式的參數(shù)量與輸入和輸出的特征圖數(shù)息息相關(guān),而從圖1可以看出中間特征圖存在大量冗余,且存在相似的特征(Ghost),所以完全沒(méi)必要占用大量計(jì)算量來(lái)計(jì)算這些Ghost。
假設(shè)原輸出的特征為某些內(nèi)在特征進(jìn)行簡(jiǎn)單的變換得到Ghost,通常這些內(nèi)在特征數(shù)量都很少,并且能通過(guò)原始卷積操作如下公式獲得,Y′∈?h′×w′×m為原始卷積輸出,f′∈?c×k×k×m為使用的卷積核,m≤n,bias直接簡(jiǎn)化了:
為了獲得原來(lái)的n維特征,對(duì)Y′的內(nèi)在特征分別使用一系列簡(jiǎn)單線性操作來(lái)產(chǎn)生s維ghost特征,Φi,j為生成y′i的j-th ghost特征圖的線性變換函數(shù),最后的Φi,s為保存內(nèi)在特征的identity mapping,整體計(jì)算如上圖2b。
簡(jiǎn)單的來(lái)說(shuō)就是:
首先,假設(shè)我們輸入特征圖的尺寸是h*w*c,輸出特征圖的尺寸是h’*w’*n,卷積核大小為k*k。
在cheap operation變換中,我們假設(shè)特征圖的channel是m,變換的數(shù)量是s,最終得到的新的特征圖的數(shù)量是n,那么我們可以得到等式:
n=m?sn = m * s
n=m?s
由于Ghost的變換過(guò)程中最后存在一個(gè)恒等變換(Identity),所以實(shí)際有效的變換數(shù)量是s-1,所以上式可以得到如下公式:
m?(s?1)=n/s?(s?1)m * (s-1) = n/s * (s-1)
m?(s?1)=n/s?(s?1)
所以我們便可以計(jì)算得到如下結(jié)果:
當(dāng)然這里還有一個(gè)條件:m << n
通過(guò)這么分析,可以體會(huì)到,其實(shí)GhostNet的方法也很簡(jiǎn)單,無(wú)外乎就是將原本的乘法變成了兩個(gè)乘法相加,然后在代碼實(shí)現(xiàn)中,其實(shí)第二個(gè)變換是用depthwise conv實(shí)現(xiàn)的。作者在文中也提到,前面的卷積使用pointwise效率比較高,所以網(wǎng)絡(luò)嫣然類似一個(gè)mobilenet的反過(guò)來(lái)的版本,只不過(guò)GhostNet采用了拼接的方式,進(jìn)一步減少了計(jì)算量。
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,:,:]
與現(xiàn)有網(wǎng)絡(luò)的不同
與目前主流的卷積操作對(duì)比,Ghost模塊有以下不同點(diǎn):
對(duì)比Mobilenet、Squeezenet和Shufflenet中大量使用1×1pointwise卷積,Ghost模塊的原始卷積可以自定義卷積核數(shù)量;
目前大多數(shù)方法都是先做pointwise卷積降維,再用depthwise卷積進(jìn)行特征提取,而Ghost則是先做原始卷積,再用簡(jiǎn)單的線性變換來(lái)獲取更多特征;
目前的方法中處理每個(gè)特征圖大都使用depthwise卷積或shift操作,而Ghost模塊使用線性變換,可以有很大的多樣性;
Ghost模塊同時(shí)使用identity mapping來(lái)保持原有特征。
框架結(jié)構(gòu)
下圖是Ghost bottleneck結(jié)構(gòu)圖,很類似resnet結(jié)構(gòu),不同的是channel是先升維再降維。
Ghost Bottleneck(G-bneck)與residual block類似,主要由兩個(gè)Ghost模塊堆疊二次,第一個(gè)模塊用于增加特征維度,增大的比例稱為expansion ration,而第二個(gè)模塊則用于減少特征維度,使其與shortcut一致。
G-bneck包含stride=1和stride=2版本,對(duì)于stride=2,shortcut路徑使用下采樣層,并在Ghost模塊中間插入stride=2的depthwise卷積。為了加速,Ghost模塊的原始卷積均采用pointwise卷積。
下面是GhostNet的網(wǎng)絡(luò)結(jié)構(gòu)圖,可以看到channel控制的比較小,并且引入了SE結(jié)構(gòu)。
實(shí)驗(yàn)
作者首先采用控制變量法,測(cè)試不同的s以及d的效果。經(jīng)過(guò)測(cè)試發(fā)現(xiàn)在s=2,d=3的情況下模型表現(xiàn)較好。
下表為在resnet50實(shí)驗(yàn)的不同網(wǎng)絡(luò)的壓縮比例以及精度對(duì)比:
可以看到使用Ghost模塊不僅比其它壓縮方法更能降低模型的體量,也最能保持模型準(zhǔn)確率:
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.
ImageNet效果對(duì)比:
目標(biāo)檢測(cè)的效果:
小結(jié)
為了減少神經(jīng)網(wǎng)絡(luò)的計(jì)算消耗,論文提出Ghost模塊來(lái)構(gòu)建高效的網(wǎng)絡(luò)結(jié)果。該模塊將原始的卷積層分成兩部分,先使用更少的卷積核來(lái)生成少量?jī)?nèi)在特征圖,然后通過(guò)簡(jiǎn)單的線性變化操作來(lái)進(jìn)一步高效地生成ghost特征圖。從實(shí)驗(yàn)來(lái)看,對(duì)比其它模型,GhostNet的壓縮效果最好,且準(zhǔn)確率保持也很不錯(cuò),論文思想十分值得參考與學(xué)習(xí)。
論文地址:https://arxiv.org/pdf/1911.11907.pdf
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。
電子管相關(guān)文章:電子管原理