文章目錄
- 輕量級神經網路——MobileNets
- MobileNetV1
- 深度可分離卷積
- 1、**深度卷積**???
- 2、**逐點卷積**???
- 引數量和計算量
- 1、**標準卷積**
- 2、**深度可分離卷積**???
- MobileNetV1的網路結構及效果
- MobileNetV2
- Linear Bottlenecks???
- Inverted Residuals???
- MobileNetV2的網路結構及效果
- MobileNetV3
- 新增SE模塊???
- 重新設計耗時層結構
- 重新設計激活函式???
- MobileNetV3的網路結構及結果
輕量級神經網路——MobileNets
MobileNetV1
深度可分離卷積
? ??之前,總結了一些深度學習的經典網路模型,如LeNet、VGG、GooogleNet等等,詳情轉移至這篇博客:深度學習經典網路模型匯總,鏈接博文中的網路模型其實已經達到了相當不錯的效果,但是存在一個的問題,就是這些模型非常龐大,引數較多,計算量較大,在一些實際的場景如移動或嵌入式設備中很難被應用,這時候就出現了可以針對這些移動場景的輕量級的網路——MobileNets,【移動的網路,是不是很輕🎈🎈🎈】
? ??那么MobileNet網路主要的做了什么呢,下面跟著我一起來看看🍋🍋🍋
? ??我們先來看一下論文中的描述,如圖所示:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-sVIb4LTZ-1645335379559)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220218144041762.png)]](https://img.uj5u.com/2022/02/21/301140210717201.png)
? ??再來重復下這句話:MobileNet模型是基于深度可分離卷積,這是一種分解卷積的形式,這種形式將標準卷積分解為一個深度卷積【這里翻譯成逐深度卷積可能更好,后文中深度卷積即指逐深度卷積】**和一個稱為逐點卷積的1x1的卷積,**讀到這句話,你可能會有點懵,不知道分解卷積是怎么操作的,但是我們先可以思考一下進行這樣的分解有什么用?可能很多小伙伴已經想到了,既然這里講的是MobileNet,而MobileNet有是輕量級的網路,那這步操作十有八九就是通過這樣的分解可以讓我們的模型更加輕量,模型引數更少!!!的確是這樣的,相關描述再原論文中也有體現,如下圖所示:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-evs6whrn-1645335379561)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220218145214477.png)]](https://img.uj5u.com/2022/02/21/301140210717202.png)
???下面就來詳細的介紹MobileNet的深度可分離卷積,按照論文上的描述,深度可分離卷積應該由兩個部分組成,即深度卷積和逐點卷積,用下圖直觀進行表示:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-Tl06qXs1-1645335379565)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220218150056365.png)]](https://img.uj5u.com/2022/02/21/301140210717203.png)
??在談及深度可分離卷積之前,我們先來溫習一下標準卷積是怎么操作的,下圖中我們可以看到我們的輸入是1個DF x DF 大小的圖片,有M個通道,卷積核大小為M x DK x DK ,有N個卷積核,那么經過卷積后輸出特征圖的大小為DF x DF,個數為N,【這里假設卷積后輸入輸出尺寸不變】
??【標準的卷積操作這里再做幾點說明,方便后面理解深度可分離卷積,首先我們的輸入通道是3,那么我們卷積核的尺度必須也有一個維度為3,其次,卷積核的個數為N,則輸出的特征圖的個數為N】
??介紹了標準的卷積后,下面來談談深度可分離卷積,我們分別來介紹深度卷積和逐點卷積,
1、深度卷積???
??深度卷積與標準卷積的區別在于深度卷積的卷積核為單通道模式,需要對輸入的每一個通道進行卷積,這樣就會得到和輸入特征圖通道數一致的輸出特征圖,通過下圖進行理解:可以看出,我們輸入特征圖的通道上為3,由于采用的卷積核是單通道模式,所以必須要三個這樣的單通道卷積核才可以和輸入影像完全一一對應的卷積,這樣就得到了輸出的特征圖,輸出特征圖的個數為3,可以發現深度卷積的輸入特征圖通道數=卷積核個數=輸出特征圖個數,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-8XXltTx4-1645335379569)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220218153442814.png)]](https://img.uj5u.com/2022/02/21/301140210717204.png)
??這里我們再用一個具體點的例子鞏固一下深度卷積,下圖中輸入12×12×3的特征圖,卷積核大小為5×5×1,卷積核個數為3,得到了8×8×3的輸出特征圖,同樣的,可以發現輸入特征圖通道數=卷積核個數=輸出特征圖個數,

???????????????????????? 來源于知乎R.JD
2、逐點卷積???
??通過上一步的深度卷積,我們得到了特征圖,但是我們發現輸入特征圖通道數=卷積核個數=輸出特征圖個數,這樣一來,就會導致輸出的特征圖的個數太少了【或者可以說輸出特征圖的通道數太少了,上圖可以看成是輸出特征圖個數為1,通道數為3】,從而可能會影響資訊的有效性,這時候就需要進行逐點卷積,逐點卷積這個名字聽起來很高大上,但是實質就是用1x1的卷積核進行升維,【1x1的卷積大家應該很熟悉了,在GoogleNet中就大量用到了1x1的卷積核,那里主要是用來降維,1x1的卷積核的主要作用就是對特征圖進行升維和降維,】同樣的,通過一些圖片進行理解:可以看出我們從上一步得到了3個特征圖【或者可以說是一個有三個通道的特征圖】,卷積核大小為1x1x3,卷積核個數為4,這樣卷積后就可以得到4個特征圖【得到特征圖的個數取決于卷積核的個數】,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-xq2zXtKN-1645335379572)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220218195652792.png)]](https://img.uj5u.com/2022/02/21/301140210717206.png)
??同樣的,我們再舉一個具體的例子來鞏固逐點卷積,當進行深度卷積后,得到8x8x3的特征圖,此時用256個大小為1x1x3的卷積核進行卷積,得到特征圖尺寸為8x8x256,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-0pxLfM3L-1645335379573)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220218200426517.png)]](https://img.uj5u.com/2022/02/21/301140210717207.png)
???????????????????????? 圖片來源于知乎R.JD
引數量和計算量
??讀到這里,其實MobileNet的核心就講完了,是不是發現還挺容易的🌻🌻🌻接下來我們再次回到開頭所說的輕量級網路,即我們要討論為什么通過上面的深度可分離卷積操作可以實作輕量級網路,我們通過比較標準的卷積和深度可分離卷積所需要的引數量和計算量來進行分析,
1、標準卷積

- 引數量:卷積核的尺寸是DK x DK×M,一共有N個,所以標準卷積的引數量是DK x DK×MxN
- 計算量:卷積核的尺寸是DK x DK×M,一共有N個,每一個都要進行DF x DF次運算【假設輸出的特征圖尺寸也是DF x DF】,所以標準卷積的計算量是DK x DK×MxNxDF x DF,
??【這里簡單說一下引數量和計算量,引數量是指網路中需要多少引數,對于卷積來說,就是卷積核里所有的值的個數,它往往和空間使用情況有關;計算量是指網路中我們進行了多少次乘加運算,對于卷積來說,我們得到的特征圖都是進行一系列的乘加運算得到的,計算公式就是卷積核的尺寸DK x DK×M、卷積核個數N、及輸出特征圖尺寸DF x DF的乘積,計算量往往和時間消耗有關,】
2、深度可分離卷積???
??深度可分離卷積由深度卷積核逐點卷積構成,


-
引數量
- 深度卷積:深度卷積的卷積核尺寸DK x DK×1,個數為M,所以引數量為DK x DK×M,
- 逐點卷積: 逐點卷積的卷積核尺寸為1×1×M,個數為N,所以引數量為M x N,
因此深度可分離卷積的引數量為DK x DK×M+M x N,
-
計算量
- 深度卷積:深度卷積的卷積核尺寸DK x DK×1,個數為M,每個都要做DF x DF次乘加運算,所以計算量為DK x DK×MxDF x DF,
- 逐點卷積:逐點卷積的卷積核尺寸為1×1×M,個數為N,每個都要做DF x DF次乘加運算,所以計算量為MxNxDF x DF,
因此深度可分離卷積的引數量為DK x DK×MxDF x DF+MxNxDF x DF,
??得到了標準卷積和深度可分離卷積的引數量和計算量,我們用它們的比值做一些比較:一般的,N較大, 1 N \frac{1}{N} N1?可忽略不計,DK 表示卷積核的大小,若DK =3, 1 D k 2 = 1 9 \frac{1}{D_k^2}=\frac{1}{9} Dk2?1?=91? ,即我們若使用常見的3×3的卷積核,那么使用深度可分離卷積的引數量和計算量下降到原來的九分之一左右,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-HBwUjji6-1645335379575)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220218214107946.png)]](https://img.uj5u.com/2022/02/21/3011402107172011.png)
MobileNetV1的網路結構及效果
??講到這里,MobileNet的最本質的深度可分離卷積算是敘述清楚了!!!明白了深度可分離卷積,接下來就很簡單,我們可以先來看一下MobileNet的網路結構,如下圖所示:明白了我之前文章中對于卷積后特征圖的變化及本文前文的講述,這個結構各步特征圖變化是很好推導的,這里不做過多闡述,但下圖中標黃部分采用了步長為2的卷積后,特征圖大小前后沒有改變,當然這是可以通過padding達到的,但是既然想保持特征圖不變,為什么不采用步長為1的卷積呢?這是我的疑惑之處,如若有知道原因的,懇請解答📝📝📝
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-93DxmYGI-1645335379577)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220218220906298.png)]](https://img.uj5u.com/2022/02/21/3011402107172012.png)
??最后,我們來看一下實驗結果:可以發現,作為輕量級網路的MobileNet計算量和引數量均小于GoogleNet,同時在分類效果上比GoogleNet還要好,這就是深度可分離卷積的功勞了,VGG16的計算量引數量比MobileNet大了30倍,但是結果也僅僅只高了1%不到,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-J9fj8SzR-1645335379578)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220218221808320.png)]](https://img.uj5u.com/2022/02/21/3011402107172013.png)
??其實,在MobileNet的論文中還提及了使用超引數來靈活調整網路,使網路在性能降低不多的情況下大量減少引數量和使用量,但我覺得這部分理解起來就較為簡單了,就是用超引數來控制影像尺寸大小及卷積核個數以達到改變模型大小的功能,感興趣的可以去看看原論文,下載地址:https://arxiv.org/abs/1704.04861,
MobileNetV2
??在MobileNetV1的實際訓練程序中,很多人發現深度卷積時卷積核特別容易廢掉,即訓練完成后很多卷積核是空的,這時候MobileV2就來了,前面談到的V1深度卷積中卷積核容易報廢,V2認為造成這樣的原因是由于Relu函式造成的(Relu默默流下了眼淚😢😢😢)可以看一下論文中的描述:下圖示黃文字的大致意思就是說**在輸入維度是2,3時,輸出和輸入相比丟失了較多資訊;但是在輸入維度是15到30時,輸出則保留了輸入的較多資訊,**這就是說我們在使用Relu函式時,當輸入的維度較低時,會丟失較多資訊,因此我們這里可以想到兩種思路,一是把Relu激活函式替換成別的,而是通過升維將輸入的維度變高,事實上V2就是這么做的,V2的題目為Inverted Residuals and Linear Bottlenecks , Linear Bottlenecks和Inverted Residuals就是V2的核心,也是上述所說兩種思路的描述,

Linear Bottlenecks???
??首先我們先來看一下MobileNetV1中深度可分離卷積的每個塊的細節:左邊是標準卷積,右邊是深度可分離卷積,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iKf2pXZ1-1645335379580)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219150041065.png)]](https://img.uj5u.com/2022/02/21/3011402107172015.png)
??深度可分離卷積的每個塊構成:首先是一個3x3的深度卷積,其次是BN、Relu層,接下來是1x1的逐點卷積,最后又是BN和Relu層,我們前文說需要把Relu激活函式替換成別的,V2將Relu替換成線性激活函式,但是需要注意的是,并不是將所有的Relu激活都換成了線性激活,而是將上圖中標黃的Relu變成了線性激活函式,變換后的塊文章中稱為Linear Bottlenecks,結構如下圖所示:

Inverted Residuals???
??Inverted Residuals中文是倒殘差結構,我們來看看其和正常的殘差結構之前有什么區別和聯系:通過下圖可以看出,左側為ResNet中的殘差結構,其結構為1x1卷積降維->3x3卷積->1x1卷積升維;右側為MobileNetV2中的倒殘差結構,其結構為1x1卷積升維->3x3DW卷積->1x1卷積降維,V2先使用1x1進行升維的原因也是前面所說的高維資訊通過ReLU激活函式后丟失的資訊更少,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-SYjmrHVU-1645335379582)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219152328879.png)]](https://img.uj5u.com/2022/02/21/3011402107172017.png)
??這部分需要注意的是只有當s=1,即步長為1時,才有shortcut連接,步長為2是沒有的,如下圖所示,

MobileNetV2的網路結構及效果
??下圖是V2的網路結構,每一步變化也很好計算,特別需要注意的是步距s,當有多個bottleneck,s只針對第一個bottleneck,后面s都為1,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-trAHgf2h-1645335379583)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219155011654.png)]](https://img.uj5u.com/2022/02/21/3011402107172019.png)
V2的效果如下:可以看到V2所用的引數更少,但Map值和其它的差不多,甚至超過了Yolov2,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iF52dBsy-1645335379585)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219155920209.png)]](https://img.uj5u.com/2022/02/21/3011402107172020.png)
原論文下載地址:MobileNetV2
MobileNetV3
??前面已經討論了V1和V2版本的mobileNet,接下來將談談V3版本的MobileNet💯💯💯當剛打開論文看摘要時,就發現出現了一個生詞NAS(網路結構搜索),怎么理解呢,這里談談自己的看法,之前的網路,不管是VGG、ResNet、MobileNetV1、MobileNetV2,網路結構都是我們自己手動去設計的,像網路的層數、卷積核大小、步長等等引數都需要自己設定,而NAS是通過計算機來實作最優的引數設定,通過比較不同引數的網路模型效果,從而選擇最優的引數設定,這么看來,NAS簡直太好了,但是這也對計算機的性能要求也特別的高,感覺是土豪玩的游戲🙈🙈🙈NAS這里就不多說了,感覺離我太遠,知道個大概就好,感興趣的可以了解下!!!接下來主要談談論文中其它的一些改進之處,

新增SE模塊???
??下圖上半部分是V2的block,下半部分是V3的block,V2的block在上文已經提及,這里不再贅述;V3的block和V2基本一致,主要是加入了SE模塊(圖中黃色框部分),怎么理解這個SE模塊呢?它首先是將特征圖的每個通道都進行平均池化,然后進行兩個全連接層得到一個輸出結果,這個結果會和原始的特征圖進行相乘,得到新的特征圖,【需要注意的是第一個全連接層的輸出設定為原來通道數的1/4(本論文中是這么設定的),第二個全連接層輸出設定為通道數】

??是不是還沒看懂,下面用一個例子來通俗解釋一下,首先下圖左上角表示為兩個通道的特質圖,經平均池化后得到左下角的圖;再次經過兩次全連接層后,轉化成了右下角的圖,最后用右下角的0.5、0.6分別乘原始的特質圖,則得到最終的右上角的圖,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-XhC6a19q-1645335379587)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219210356512.png)]](https://img.uj5u.com/2022/02/21/3011402107172023.png)
???????????????????????? 圖片來自B站UP主霹靂吧啦Wz
重新設計耗時層結構
-
減少第一個卷積層卷積核個數(32——>16)
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-eHMQeQYs-1645335379588)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219213131983.png)]](https://img.uj5u.com/2022/02/21/3011402107172024.png)
-
精簡Last Stage
??Original Last Stage是通過NAS算出來的,但最后實際測驗發現Efficient Last Stage結構可以在不損失精度情況下去年一些多余的層,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-hztcM66h-1645335379589)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219213846251.png)]](https://img.uj5u.com/2022/02/21/3011402107172025.png)
重新設計激活函式???
??在V1和V2版本中我們用到的Relu激活函式其實是Relu6激活函式,前文沒有講述,這里進行統一講解,下圖為Relu和Relu6的影像和運算式:
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-gW9tojVJ-1645335379591)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219215335231.png)]](https://img.uj5u.com/2022/02/21/3011402107172026.png)
??V3版本使用的激活函式為h-swish,其影像和運算式如下圖所示:圖中包括了一些其他相關的一些函式運算式及影像,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-cy1enWzu-1645335379592)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219220359028.png)]](https://img.uj5u.com/2022/02/21/3011402107172027.png)
MobileNetV3的網路結構及結果
??V3的網路結構如下,每一步也很好推,這里也不再進行描述,下圖是V3-Large的網路結構,V3-small與其類似,這里不在敘述,
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-4BdFDCs4-1645335379593)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219221747292.png)]](https://img.uj5u.com/2022/02/21/3011402107172028.png)
V3的模型效果如下:優勢還是挺明顯的💯💯💯
![[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-vH5PperE-1645335379594)(C:\Users\WSJ\AppData\Roaming\Typora\typora-user-images\image-20220219222229812.png)]](https://img.uj5u.com/2022/02/21/3011402107172029.png)
原論文下載地址:MobileNetV3
如若文章對你有所幫助,那就🛴🛴🛴
咻咻咻咻~~duang~~點個贊唄
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/429294.html
標籤:AI
上一篇:R語言常用基礎函式:length函式查看資料物件的長度、str函式查看資料物件的結構、class函式查看資料物件的型別、names函式查看資料物件的名稱
