深度解讀輕量網(wǎng)絡(luò)GhostNet:不用訓(xùn)練、即插即用的CNN升級(jí)組件究竟如何實(shí)現(xiàn)?
文章結(jié)構(gòu):
一、前言二、論文閱讀
三、代碼實(shí)驗(yàn)(實(shí)驗(yàn)1. 訓(xùn)練模型/實(shí)驗(yàn)2. 計(jì)算Weights和FLOPs/實(shí)驗(yàn)3. 可視化特征圖)
四、Ghost Module下一步工作探討(方案1:借助baseline的卷積核參數(shù)/方案2:真正意義的即插即用/方案3:定制符合Ghost module的baseline)
五、結(jié)語(yǔ)
一、前言
CVPR 2020 上個(gè)月放榜,其中有一篇論文提出了一種新奇的輕量級(jí)卷積神經(jīng)網(wǎng)絡(luò)設(shè)計(jì),思想非常巧妙,于是對(duì)其進(jìn)行閱讀和代碼實(shí)踐,并總結(jié)一些可能的下一步工作,供大家參考,共同學(xué)習(xí)。
本筆記主要分為三個(gè)部分,第一部分是論文閱讀,對(duì)論文中要點(diǎn)進(jìn)行講解。第二部分是代碼實(shí)驗(yàn)部分,對(duì)論文中提出的部分實(shí)驗(yàn)進(jìn)行代碼實(shí)驗(yàn),包含模型訓(xùn)練,參數(shù)量計(jì)算,特征圖可視化。第三部分是下一步工作,提出一些失敗及未實(shí)現(xiàn)的想法,來(lái)實(shí)現(xiàn)不需要訓(xùn)練的即插即用Ghost module。
二、論文閱讀
論文題名:《GhostNet: More Features from Cheap Operations》?
arxiv:?https://arxiv.org/abs/1911.11907
github :https://github.com/huawei-noah/ghostnet
作者翻譯:https://zhuanlan.zhihu.com/p/109325275?
摘要
在優(yōu)秀CNN模型中,特征圖存在冗余是非常重要的,但是很少有人在模型結(jié)構(gòu)設(shè)計(jì)上考慮特征圖冗余問(wèn)題(The redundancy in feature maps)。
而本文就從特征圖冗余問(wèn)題出發(fā),提出一個(gè)僅通過(guò)少量計(jì)算(cheap operations)就能生成大量特征圖的結(jié)構(gòu)——Ghost Module。
Ghost Module通過(guò)怎么樣的操作生成特征圖呢?這個(gè)操作是,一系列線性操作(a series of linear transformations)
在這里,經(jīng)過(guò)線性操作生成的特征圖稱為ghost feature maps,而被操作的特征圖稱為intrinsic feature maps。
Ghost Module的操作那么魔幻,那么它有什么作(you)用(dian)??
1. 即插即用:Ghost Module是一個(gè)即插即用模塊,可以無(wú)縫銜接現(xiàn)有的CNN中。
2.?采用Ghost Module組成的Ghost bottlenecks,設(shè)計(jì)出Ghost Net,在ILSVRC-2012上top1超過(guò)Mobilenet-V3,并且參數(shù)更少。?
看完摘要,存在一些疑惑:
首先,特征圖冗余((The redundancy in feature maps))具體是什么意思?
其次,ghost feature maps 和intrinsic feature maps又是什么?
還有,一系列線性操作(a series of linear transformations)是什么?它為什么是cheap operations?
最后,Ghost Module長(zhǎng)什么樣?Ghost bottlenecks長(zhǎng)什么樣?Ghost Net長(zhǎng)什么樣??
這真是吊胃口的摘要,為了回答以上四個(gè)問(wèn)題,接著往下看:?
問(wèn)題1:?何為特征圖冗余?
先找找關(guān)于特征圖冗余的解釋,Introduction 第四段提到:
"For exam- ple, Figure 1 presents some feature maps of an input image generated by ResNet-50, and there exist many similar pairs of feature maps, like a?ghost?of each another".
對(duì)ResNet-50第一個(gè)殘差塊特征圖進(jìn)行可視化,但是,并沒(méi)有直接說(shuō)ResNet-50特征圖存在冗余,而是用了這樣的一句話“there exist many similar pairs of feature maps”。那么來(lái)看看Figure 1吧。

圖1 對(duì)ResNet-50的特征圖進(jìn)行可視化,并強(qiáng)調(diào)了3組特征圖,分別用紅綠藍(lán)三種顏色圈出來(lái)了,說(shuō)這些特征圖,可以近似的通過(guò)cheap operations來(lái)生成。又出現(xiàn)了cheap operations,到底是啥?這個(gè)圖并沒(méi)有給答案,只告訴了大家cheap operations就是那個(gè)小扳手(皮...),繼續(xù)看吧。
?再次強(qiáng)調(diào)特征圖冗余就到了3.1 Ghost Module for More Features?第一段,“Given the widely existing redundancy in intermediate feature maps calculated by mainstream CNNs as shown in Figure 1”
這里說(shuō)圖1那樣就是冗余了,請(qǐng)大家回到圖1去看吧,哈?圖1叫我往下看,看到這里又叫我回圖1去找特征圖冗余?
看到這里懵懵的了吧,接下來(lái)就有答案了。?
第三段”the output feature maps of convolutional layers often contain much redundancy, and some of them could be similar with each other“
這里說(shuō)看著相似的那些就是冗余了,原來(lái)如此,圖1中,作者用紅綠藍(lán)重點(diǎn)給我們標(biāo)記的那些就是冗余特征圖的代表?
到這里,可以知道那些相似的特征圖被認(rèn)為是冗余的,但是特征圖冗余是什么,是沒(méi)有定義的,只能意會(huì),第一個(gè)問(wèn)題到此結(jié)束。?
問(wèn)題2:Ghost feature maps 和 Intrinsic feature maps 是什么?
作者給那些特征圖賦名為Ghost,的確用心良苦,畢竟這兩個(gè)概念難以言傳,請(qǐng)往下意會(huì)吧。
Introduction 第5段提到?“Given the intrinsic feature maps from the first part, a series of simple linear operations are then applied for generating more feature maps”。從這里知道兩者的關(guān)系,即 intrinsic feature maps 執(zhí)行 linear operations 得到 ghost feature maps
?

更形象的參見(jiàn)圖2,即假設(shè)一組特征圖中,一部分是Intrinic,而另外一部分是可以由 intrinsic 通過(guò)cheap operations來(lái)生成的。
cheap operations反復(fù)出現(xiàn)多次,但是到底是什么操作,還是不知道,下面看第三個(gè)問(wèn)題。
?問(wèn)題3:Linear transformations 和 Cheap operations 是什么?
其實(shí),從上文就知道 linear operations 等價(jià)于 cheap operations,它們是一回事。
文中3.1 終于提到了,linear operations 即是 諸如3*3的卷積,或者5*5的卷積。
“Note that the linear operations Φ operate on each channel whose computational cost is much less than the ordinary convolution. In practice, there could be several different linear operations in a Ghost module, e.g. 3 × 3 and 5 × 5 linear kernels, which will be analyzed in the experiment part.”
?弄清楚摘要里出現(xiàn)的一系列概念,終于可以進(jìn)入論文的核心——Ghost Module,Ghost Bottlenecks,?Ghost Net?
問(wèn)題4:Ghost Module長(zhǎng)什么樣?Ghost Bottlenecks長(zhǎng)什么樣?Ghost Net長(zhǎng)什么樣?

圖2很好的解釋了 Ghost Module。
通常的卷積如圖2(a)所示,而Ghost Module則分為兩步操作來(lái)獲得與普通卷積一樣數(shù)量的特征圖(這里需要強(qiáng)調(diào),是數(shù)量一樣)。
第一步:少量卷積(比如正常用32個(gè)卷積核,這里就用16個(gè),從而減少一半的計(jì)算量);
第二步:cheap operations,如圖中的Φ表示,從問(wèn)題3中可知,Φ是諸如3*3的卷積,并且是逐個(gè)特征圖的進(jìn)行卷積(Depth-wise convolutional)。
這里應(yīng)該是本文最大的創(chuàng)新點(diǎn)和貢獻(xiàn)了。?
了解了Ghost Module,下面看Ghost Bottlenecks。

論文3.2 介紹Ghost Bottlenecks ,結(jié)構(gòu)與ResNet的是類(lèi)似的,并且與mobilenet-v2一樣在第二個(gè)module之后不采用ReLU激活函數(shù)。
左邊是stride=1的Ghost Bottlenecks,右邊是stride=2的Ghost Bottlenecks,目的是為了縮減特征圖大小。
接著來(lái)看Ghost Net,Ghost Net結(jié)構(gòu)與MobileNet-V3類(lèi)似,并且用了SE結(jié)構(gòu),如下表,其中#exp表示G-bneck的第一個(gè)G-Module輸出特征圖數(shù)量

到這里,論文中概念全都清晰了,下面看看實(shí)驗(yàn)及效果吧。?
實(shí)驗(yàn)及結(jié)果
?實(shí)驗(yàn)一,Toy Experiments,這個(gè)實(shí)驗(yàn)結(jié)果并不重要,只需要知道結(jié)論可以了,即 cheap operations中的卷積核選擇3*3最佳。
在這里,有探討?cheap operations為什么用卷積,請(qǐng)看
“Besides convolutions used in the above experiments, we can also explore some other low-cost linear operations to construct the Ghost module such as affine transformation and wavelet transformation. However, convolution is an efficient operation already well support by current hardware and it can cover a number of widely used linear operations such as smoothing, blurring, motion, etc. Moreover, although we can also learn the size of each filter w.r.t. the linear operation Φ, the irregular module will reduce the efficiency of computing units (e.g. CPU and GPU).”
簡(jiǎn)單地說(shuō),卷積高效且高質(zhì),所以linear transformations和cheap operations就是卷積,沒(méi)錯(cuò)了。
實(shí)驗(yàn)二,在Cifar10上,對(duì)VGG-16和ResNet-56進(jìn)行g(shù)host module的即插即用實(shí)驗(yàn),具體做法是,對(duì)于VGG-16和ResNet-56,其中的所有卷積替換為Ghost module,并命名為 Ghost-VGG-16和Ghost-ResNet-56。
實(shí)驗(yàn)結(jié)果如下表,精度不怎么變化的條件下,參數(shù)和FLOPs均減少一半左右,效果不賴。

作者還對(duì)?vanilla VGG-16?以及?Ghost-VGG-16的第二個(gè)卷積特征圖進(jìn)行可視化,大意就是經(jīng)過(guò)?cheap operation,得到的特征圖與vanilla的差不多

實(shí)驗(yàn)三,在Imagenet?對(duì)ResNet-50進(jìn)行g(shù)host module的即插即用實(shí)驗(yàn)
這里s=4,所以參數(shù)和FLOPs大約也減小為1/4

?
三、代碼實(shí)驗(yàn)
讀完論文就迫不及待想試試神奇的ghost module的能力。由于沒(méi)有設(shè)備,未能在imagenet上訓(xùn)練ghostnet,這里僅對(duì)cifar10進(jìn)行了復(fù)現(xiàn)實(shí)驗(yàn),有機(jī)器的話,修改模型和dataloader就可以訓(xùn)練imagenet了。
?實(shí)驗(yàn)代碼主要有三個(gè)部分:
1.?訓(xùn)練模型,訓(xùn)練文中提到的vgg16,?ghost-vgg16,?resnet56,?ghost-resnet56
2.?計(jì)算Weights和FLOPs, 計(jì)算4個(gè)模型的Weights和FLOPs
3.?可視化特征圖,對(duì)vgg16,ghost-vgg16所有卷積特征圖進(jìn)行可視化?
上述實(shí)現(xiàn)代碼在:https://github.com/TingsongYu/ghostnet_cifar10
參考github
ghost部分:https://github.com/huawei-noah/ghostnet
vgg部分:https://github.com/kuangliu/pytorch-cifar
resnet部分:https://github.com/akamaster/pytorch_resnet_cifar10?
實(shí)驗(yàn)1.?訓(xùn)練模型
這部分訓(xùn)練論文中提到的vgg16,?ghost-vgg16,?resnet56,?ghost-resnet56?
step1:?數(shù)據(jù)準(zhǔn)備從http://www.cs.toronto.edu/~kriz/cifar.html?下載python版,得到cifar-10-python.tar.gz,解壓得到?cifar-10-batches-py,并放到ghostnet_cifar10/data下,然后執(zhí)行?python bin/01_parse_cifar10_to_png.py,可在data/文件夾下獲得cifar10_train?和?cifar10_test兩個(gè)文件夾?
step2:?模型訓(xùn)練訓(xùn)練腳本為?bin/02_main.py?
訓(xùn)練resnet56
nohup python 02_main.py -gpu 1 0 -arc resnet56 > resnet56.log 2>&1 &
訓(xùn)練ghost-resnet56
nohup python bin/02_main.py -max_epoch 190 -lr 0.1 -gpu 1 0 -arc resnet56 -replace_conv > ghost-resnet56.log 2>&1 &
訓(xùn)練?vgg16
nohup?python bin/02_main.py -max_epoch 190 -lr 0.1 -gpu 1 0 -arc vgg16 > vgg16.log 2>&1 &
訓(xùn)練ghost-vgg16
nohup python bin/02_main.py -max_epoch 190 -lr 0.1 -gpu 1 0 -arc vgg16 -replace_conv > ghost-vgg16.log 2>&1 &
?
參數(shù)解釋
-?replace_conv,?表示是否將模型中的conv2d層替換為GhostModule
- arc,目前寫(xiě)死了,只支持resnet56, vgg16,可自行修改
- gpu,gpu編號(hào)
-?pretrain,訓(xùn)練ghost-***時(shí),加載baseline的卷積核參數(shù),這個(gè)不屬于論文范疇,屬于拓展的訓(xùn)練方法,拓展部分講解
- frozen_primary,凍結(jié)primary部分的卷積核,訓(xùn)練ghost-***時(shí),采用baseline的卷積核參數(shù)初始化之后對(duì)primary部分卷積核進(jìn)行凍結(jié),只訓(xùn)練cheap conv部分
-?low_lr,primary部分卷積核學(xué)習(xí)率是否小10倍
- point_conv,block中第一個(gè)primary是否采用1*1卷積?
代碼結(jié)構(gòu)
結(jié)構(gòu)比較清晰,分為5個(gè)步驟, 數(shù)據(jù)--模型--損失函數(shù)--優(yōu)化器--迭代訓(xùn)練核心在于replace_conv函數(shù)進(jìn)行卷積核替換為GhostModule,實(shí)現(xiàn)論文的操作,只需要傳入三個(gè)參數(shù),分別是model, GhostModule和arc即可?
結(jié)果輸出
實(shí)驗(yàn)結(jié)果輸出均在results/文件夾下,以時(shí)間戳為子文件夾,未自動(dòng)記錄log?
實(shí)驗(yàn)超參

實(shí)驗(yàn)超參按Ghostnet論文中提到那樣,與Resnet論文中保持一致,lr=0.1,?bs=128,2個(gè)gpu,epoch通過(guò)iteration轉(zhuǎn)換得來(lái)的?
實(shí)驗(yàn)結(jié)果
實(shí)驗(yàn)日志、曲線、checkpoint均在results里獲得。實(shí)驗(yàn)結(jié)果如下表所示,與原文中提到的精度還是有一點(diǎn)點(diǎn)差距,不知是什么原因,大家也可以嘗試一下參照論文中的設(shè)置進(jìn)行實(shí)驗(yàn),歡迎大家貢獻(xiàn)自己的訓(xùn)練log和results到github上供大家一起學(xué)習(xí)。

實(shí)驗(yàn)2.?計(jì)算Weights和FLOPs
腳本:bin/03_compute_flops.py?
前期準(zhǔn)備:安裝torchstatWeights和FLOPs的計(jì)算采用torchstat工具,必須是python3以上才可安裝
安裝方法:pip install torchstattorchstat網(wǎng)站:https://github.com/Swall0w/torchstat
方法:執(zhí)行03_compute_flops.py 即可得到Weights和FLOPs,得到的結(jié)果與論文中有一些誤差,具體如下:

實(shí)驗(yàn)3.?可視化特征圖
腳本:bin/04_fmap_vis.py
方法:運(yùn)行腳本會(huì)在 results/runs下以時(shí)間戳為子文件夾記錄下events file,然后借助tensorboard就可以查看特征圖?
與論文一致,對(duì)vgg16和ghost-vgg16進(jìn)行可視化,可視化的圖片也與論文一致,是那只可愛(ài)的小狗,可是論文沒(méi)告訴大家那張圖片在哪里,所以我人肉把那張可愛(ài)的狗狗給人肉出來(lái)了,在cifar10_train/5/5_11519.png?
來(lái)看看VGG16第二個(gè)卷積層,是這樣的

ghost-vgg16的第二個(gè)卷積部分的primary和cheap的卷積特征圖如下:

在這里發(fā)現(xiàn)cheap conv中有死神經(jīng)元,輸出是全黑的,不知道是哪個(gè)地方出錯(cuò)了,是否是這里導(dǎo)致模型指標(biāo)達(dá)不到論文的水平呢?大家可以關(guān)注一下這個(gè)問(wèn)題?
四、Ghost Module下一步工作探討
ghostmodule的思想是很巧妙的,它還有很多東西可以改進(jìn),可以去做的地方,這里就提幾個(gè)想到的方案,但是經(jīng)過(guò)代碼實(shí)踐失敗的idea。
所有的動(dòng)機(jī)都是基于文中這張圖:

圖中可知,Ghost module中的primary conv與原始卷積是一模一樣的操作,唯一不同是cheap conv的逐通道卷積會(huì)改變一半的特征圖,那么能否找到恰當(dāng)?shù)闹鹜ǖ谰矸e核,讓這一半特征圖盡可能的與原始卷積得到的特征圖一模一樣,就可以實(shí)現(xiàn)不需要訓(xùn)練的即插即用。
思想就是,讓Ghost module輸出的特征圖保持與原始卷積一致,那么就可以實(shí)現(xiàn)不需要訓(xùn)練的即插即用。
要想完成上述需求,可分為2步:
1. 針對(duì)primary convolutoin:先從baseline模型中挑選一半的卷積核直接賦值給Ghost module的primary conv,這一步是完全等價(jià)的,很好理解。
2. 針對(duì)cheap convolution:找到恰當(dāng)卷積核權(quán)值使得Ghost module輸出的特征圖與原始卷積盡可能保持一致?針對(duì)第一步,得出方案1
方案1:借助baseline的卷積核參數(shù)
從baseline中挑選卷積核賦值到?ghost-baseline模型的primary convolution具體操作只需要在?02_main.py 中 添加-pretrain,即可在replace_conv函數(shù)中執(zhí)行baseline卷積核賦值操作。
在這里就會(huì)有一個(gè)問(wèn)題,假設(shè)baseline的卷積層2K個(gè)卷積核,那么如何挑選出K個(gè)最有價(jià)值的卷積核呢??
這是最頭疼的問(wèn)題,按論文的思想,應(yīng)該從特征圖上去觀察,哪些卷積核得到的特征圖比較接近,那么就從相近的特征圖對(duì)應(yīng)的卷積核中挑選出一個(gè)。
這里就采用了卷積核聚類(lèi)的方法來(lái)挑選8個(gè)卷積核,然后賦值。這個(gè)方案效果不好,多種嘗試均存在掉點(diǎn),于是放棄了,大家也可以嘗試不同超參進(jìn)行訓(xùn)練,看一下效果。?
在方案1中,還有多種子問(wèn)題,這里就列舉一下:
問(wèn)題1. 如何從baseline中2K個(gè)卷積核中挑選K個(gè)卷積核?
1. 從特征圖中選擇相近的卷積核;
2. 采用聚類(lèi)方法對(duì)卷積核進(jìn)行聚類(lèi),聚類(lèi)類(lèi)別為K個(gè)類(lèi)別;
3. 對(duì)卷積核進(jìn)行L1排序,挑選L1較大的前K個(gè);
4. 對(duì)卷積核進(jìn)行熵的計(jì)算,挑選熵較大的前K個(gè);
上述4個(gè)方法匯總,1,3,4都可在代碼中找到對(duì)應(yīng)函數(shù),但由于效果不好,就沒(méi)有指出。?
問(wèn)題2. ghost-baseline訓(xùn)練中,primary是否需要更新?
按論文的思想,primary 卷積核來(lái)自baseline的卷積核,應(yīng)該是一個(gè)已經(jīng)訓(xùn)練得很好的卷積核了,因此不需要再訓(xùn)練,只要保證cheap convolution的卷積核學(xué)習(xí)到比較好的線性變換就可以。但實(shí)際上,如果凍結(jié)primary的卷積核,模型性能大幅下降,這里可以通過(guò)參數(shù)?-low_lr 和?-frozen_primary分別實(shí)現(xiàn)primary采用較小學(xué)習(xí)率或完全不更新。?
問(wèn)題3.?特征圖拼接是否需按順序
由于primary卷積核來(lái)自baseline,特征圖拼接部分應(yīng)該按卷積核順序拼接,否則下一個(gè)primary卷積接收的特征圖就亂了。
因此對(duì)Ghost Module進(jìn)行了少少修改,增加fmap_order參數(shù)用于記錄卷積核順序,同時(shí)在forward中增加特征圖排序。?
經(jīng)過(guò)不斷實(shí)驗(yàn),想通過(guò)baseline的訓(xùn)練參數(shù)進(jìn)行即插即用的方案暫時(shí)以失敗告終。
想從baseline中借用已經(jīng)訓(xùn)練好的卷積核方案還不成熟,希望大家可針對(duì)這個(gè)想法進(jìn)一步改進(jìn),按論文中的理論,baseline中的卷積核應(yīng)該可以拿到ghost-baseline中用一用的。?
針對(duì)第二步,得出方案2
方案2:真正意義的即插即用
文中提到的即插即用是模型結(jié)構(gòu)的變換,但是還需要重新訓(xùn)練,那么有沒(méi)有方案實(shí)現(xiàn)真正意義的即插即用,不用訓(xùn)練?
要實(shí)現(xiàn)不訓(xùn)練的即插即用,就要回顧Ghost Module對(duì)原始Conv的改變,這里還要回顧這張圖:
從圖中可以發(fā)現(xiàn),唯一變化的地方就是 cheap operation導(dǎo)致一半的特征圖變化。
因此,重點(diǎn)關(guān)注cheap部分的卷積核,只要這部分的卷積核能實(shí)現(xiàn)從intrinsic feature maps中變換得到與baseline卷積核對(duì)input進(jìn)行卷積得到的特征圖一致的特征圖,那么Ghost Module就實(shí)現(xiàn)了不需要訓(xùn)練的即插即用。
上面那句話很是繞口,下面配圖解釋方案2的想法,如何可以實(shí)現(xiàn)不訓(xùn)練的即插即用。?
先看下圖,上半部分是正常的卷積,下半部分是Ghost module示意圖。

為了更好理解intrinsic和ghost,正常卷積的卷積操作拆分為兩個(gè)部分,分別是W_i,和W_g,分別對(duì)應(yīng)intrinsic和ghost,其中W_i是需要保留的卷積核,它得到的特征圖為F_i,這一部分在Ghost Module中是完全被保留的,因此它的特征圖不會(huì)發(fā)生變化,發(fā)現(xiàn)變化的是W_g部分卷積核卷積得到的F_g。?
再看下半部分的Ghost Module中,特征圖被變化的是cheap ops中的生成的F_c。如何找到恰當(dāng)?shù)臋?quán)值W_c使得F_c等價(jià)于F_g呢?
為了得到W_c的權(quán)值,可以從文中的假設(shè)出發(fā),intrinsic feature maps和ghost feature maps存在線性變換的話,勢(shì)必存在公式F_g = W*F_i, 其中W是權(quán)值矩陣。
卷積操作又可以寫(xiě)成矩陣乘法的形式,那么我們可以找到W的權(quán)值,請(qǐng)看下圖公式

當(dāng)我們得到W矩陣,那么就得到了W_c矩陣。
這里存在一個(gè)問(wèn)題,W_i是否可逆?大部分情況都是不可逆的,所以這個(gè)方案通過(guò)這個(gè)思路還是受阻的,當(dāng)然大家可以嘗試求偽逆,得到W矩陣,然后賦值給cheap ops中的卷積核,試一下效果,這里僅提供一個(gè)思路,就沒(méi)有去實(shí)現(xiàn)了。?
方案3:定制符合Ghost module的baseline
方案2中無(wú)法找到合適的線性變換,使得F_g = F_i ,其根本原因是baseline的卷積部分的卷積核之間不存在這種線性關(guān)系。
那么,為了實(shí)現(xiàn)不訓(xùn)練的即插即用,是否可以從baseline結(jié)構(gòu)出發(fā),設(shè)計(jì)一個(gè)卷積核內(nèi)部存在線性變換的模型結(jié)構(gòu),然后再用以上等價(jià)方式進(jìn)行變換到ghost module。
不知道卷積核內(nèi)部存在線性變換的結(jié)構(gòu)是否已經(jīng)有論文提出?如果有,請(qǐng)發(fā)郵件(yts3221@126.com)或評(píng)論告訴大家吧。
五、結(jié)語(yǔ)
Ghost Module的想法很巧妙,可即插即用的實(shí)現(xiàn)輕量級(jí)卷積模型,但若能實(shí)現(xiàn)不訓(xùn)練的輕量級(jí)卷積模型,那就更好了。這也是本筆記中遺憾的部分,未能實(shí)現(xiàn)不訓(xùn)練的即插即用,在此希望集思廣益,改進(jìn)上述提出的不成熟方案,說(shuō)不定GhostNet-V2就誕生了,當(dāng)然更期待原作者提出GhostNet-V2。