【深度学习】 - MobileNet使用的可分离卷积
任何看過MobileNet架構(gòu)的人都會遇到可分離卷積(separable convolutions)這個(gè)概念。但什么是“可分離卷積”,它與標(biāo)準(zhǔn)的卷積又有什么區(qū)別?可分離卷積主要有兩種類型:
空間可分離卷積(spatial separable convolutions)深度可分離卷積(depthwise separable convolutions)空間可分離卷積
從概念上講,這是兩者中較容易的一個(gè),并說明了將一個(gè)卷積分成兩部分(兩個(gè)卷積核)的想法,所以我將從這開始。 不幸的是,空間可分離卷積具有一些顯著的局限性,這意味著它在深度學(xué)習(xí)中沒有被大量使用。
空間可分卷積之所以如此命名,是因?yàn)樗饕幚韴D像和卷積核(kernel)的空間維度:寬度和高度。 (另一個(gè)維度,“深度”維度,是每個(gè)圖像的通道數(shù))。
空間可分離卷積簡單地將卷積核劃分為兩個(gè)較小的卷積核。 最常見的情況是將3x3的卷積核劃分為3x1和1x3的卷積 核,如下所示:
圖1:在空間上分離3x3內(nèi)核
現(xiàn)在,我們不是用9次乘法進(jìn)行一次卷積,而是進(jìn)行兩次卷積,每次3次乘法(總共6次),以達(dá)到相同的效果。 乘法較少,計(jì)算復(fù)雜性下降,網(wǎng)絡(luò)運(yùn)行速度更快。
圖2:簡單且空間可分離的卷積
最著名的可在空間上分離的卷積是用于邊緣檢測的sobel卷積核:
圖3:分離的Sobel卷積核
空間可分卷積的主要問題是并非所有卷積核都可以“分離”成兩個(gè)較小的卷積核。 這在訓(xùn)練期間變得特別麻煩,因?yàn)榫W(wǎng)絡(luò)可能采用所有可能的卷積核,它最終只能使用可以分成兩個(gè)較小卷積核的一小部分。
深度可分離卷積
與空間可分離卷積不同,深度可分離卷積與卷積核無法“分解”成兩個(gè)較小的內(nèi)核。 因此,它更常用。 這是在keras.layers.SeparableConv2D或tf.layers.separable_conv2d中看到的可分離卷積的類型。
深度可分離卷積之所以如此命名,是因?yàn)樗粌H涉及空間維度,還涉及深度維度(信道數(shù)量)。 輸入圖像可以具有3個(gè)信道:R、G、B。 在幾次卷積之后,圖像可以具有多個(gè)信道。 你可以將每個(gè)信道想象成對該圖像特定的解釋說明(interpret); 例如,“紅色”信道解釋每個(gè)像素的“紅色”,“藍(lán)色”信道解釋每個(gè)像素的“藍(lán)色”,“綠色”信道解釋每個(gè)像素的“綠色”。 具有64個(gè)通道的圖像具有對該圖像的64種不同解釋。
類似于空間可分離卷積,深度可分離卷積將卷積核分成兩個(gè)單獨(dú)的卷積核,這兩個(gè)卷積核進(jìn)行兩個(gè)卷積:深度卷積和逐點(diǎn)卷積。 但首先,讓我們看看正常的卷積是如何工作的。
標(biāo)準(zhǔn)的卷積:
如果你不知道卷積如何在一個(gè)二維的角度下進(jìn)行工作,請閱讀本文或查看此站點(diǎn)。
然而,典型的圖像并不是2D的; 它在具有寬度和高度的同時(shí)還具有深度。 讓我們假設(shè)我們有一個(gè)12x12x3像素的輸入圖像,即一個(gè)大小為12x12的RGB圖像。
讓我們對圖像進(jìn)行5x5卷積,沒有填充(padding)且步長為1.如果我們只考慮圖像的寬度和高度,卷積過程就像這樣:12x12 - (5x5) - > 8x8。 5x5卷積核每25個(gè)像素進(jìn)行標(biāo)量乘法,每次輸出1個(gè)數(shù)。 我們最終得到一個(gè)8x8像素的圖像,因?yàn)闆]有填充(12-5 + 1 = 8)。
然而,由于圖像有3個(gè)通道,我們的卷積核也需要有3個(gè)通道。 這就意味著,每次卷積核移動時(shí),我們實(shí)際上執(zhí)行5x5x3 = 75次乘法,而不是進(jìn)行5x5 = 25次乘法。
和二維中的情況一樣,我們每25個(gè)像素進(jìn)行一次標(biāo)量矩陣乘法,輸出1個(gè)數(shù)字。經(jīng)過5x5x3的卷積核后,12x12x3的圖像將成為8x8x1的圖像。
圖4:具有8x8x1輸出的標(biāo)準(zhǔn)卷積
如果我們想增加輸出圖像中的信道數(shù)量呢?如果我們想要8x8x256的輸出呢?
好吧,我們可以創(chuàng)建256個(gè)卷積核來創(chuàng)建256個(gè)8x8x1圖像,然后將它們堆疊在一起便可創(chuàng)建8x8x256的圖像輸出。
圖5:擁有8x8x256輸出的標(biāo)準(zhǔn)卷積
這就是標(biāo)準(zhǔn)卷積的工作原理。我喜歡把它想象成一個(gè)函數(shù):12x12x3-(5x5x3x256)->12x12x256(其中5x5x3x256表示內(nèi)核的高度、寬度、輸入信道數(shù)和輸出信道數(shù))。并不是說這不是矩陣乘法;我們不是將整個(gè)圖像乘以卷積核,而是將卷積核移動到圖像的每個(gè)部分,并分別乘以圖像的一小部分。
深度可分離卷積的過程可以分為兩部分:深度卷積(depthwise convolution)和逐點(diǎn)卷積(pointwise convolution)。
第1部分-深度卷積:
在第一部分,深度卷積中,我們在不改變深度的情況下對輸入圖像進(jìn)行卷積。我們使用3個(gè)形狀為5x5x1的內(nèi)核。
視頻1:通過一個(gè)3通道的圖像迭代3個(gè)內(nèi)核:
https://www.youtube.com/watch?v=D_VJoaSew7Q
?
圖6:深度卷積,使用3個(gè)內(nèi)核將12x12x3圖像轉(zhuǎn)換為8x8x3圖像
每個(gè)5x5x1內(nèi)核迭代圖像的一個(gè)通道(注意:一個(gè)通道,不是所有通道),得到每25個(gè)像素組的標(biāo)量積,得到一個(gè)8x8x1圖像。將這些圖像疊加在一起可以創(chuàng)建一個(gè)8x8x3的圖像。
第2部分-逐點(diǎn)卷積:
記住,原始卷積將12x12x3圖像轉(zhuǎn)換為8x8x256圖像。目前,深度卷積已經(jīng)將12x12x3圖像轉(zhuǎn)換為8x8x3圖像。現(xiàn)在,我們需要增加每個(gè)圖像的通道數(shù)。
逐點(diǎn)卷積之所以如此命名是因?yàn)樗褂昧艘粋€(gè)1x1核函數(shù),或者說是一個(gè)遍歷每個(gè)點(diǎn)的核函數(shù)。該內(nèi)核的深度為輸入圖像有多少通道;在我們的例子中,是3。因此,我們通過8x8x3圖像迭代1x1x3內(nèi)核,得到8x8x1圖像。
?
圖7:逐點(diǎn)卷積,將一個(gè)3通道的圖像轉(zhuǎn)換為一個(gè)1通道的圖像
我們可以創(chuàng)建256個(gè)1x1x3內(nèi)核,每個(gè)內(nèi)核輸出一個(gè)8x8x1圖像,以得到形狀為8x8x256的最終圖像。
?
圖8:256個(gè)核的逐點(diǎn)卷積,輸出256個(gè)通道的圖像
就是這樣!我們把卷積分解成兩部分:深度卷積和逐點(diǎn)卷積。更抽象地說,如果原始卷積函數(shù)是12x12x3 - (5x5x3x256)→12x12x256,我們可以將這個(gè)新的卷積表示為12x12x3 - (5x5x1x1) - > (1x1x3x256) - >12x12x256。
好的,但是創(chuàng)建一個(gè)深度可分離卷積有什么意義呢?
我們來計(jì)算一下計(jì)算機(jī)在原始卷積中要做的乘法的個(gè)數(shù)。有256個(gè)5x5x3內(nèi)核可以移動8x8次。這是256 x3x5x5x8x8 = 1228800乘法。
可分離卷積呢?在深度卷積中,我們有3個(gè)5x5x1的核它們移動了8x8次。也就是3x5x5x8x8 = 4800乘以。在點(diǎn)態(tài)卷積中,我們有256個(gè)1x1x3的核它們移動了8x8次。這是256 x1x1x3x8x8 = 49152乘法。把它們加起來,就是53952次乘法。
52,952比1,228,800小很多。計(jì)算量越少,網(wǎng)絡(luò)就能在更短的時(shí)間內(nèi)處理更多的數(shù)據(jù)。
然而,這是如何實(shí)現(xiàn)的呢?我第一次遇到這種解釋時(shí),我的直覺并沒有真正理解它。這兩個(gè)卷積不是做同樣的事情嗎?在這兩種情況下,我們都通過一個(gè)5x5內(nèi)核傳遞圖像,將其縮小到一個(gè)通道,然后將其擴(kuò)展到256個(gè)通道。為什么一個(gè)的速度是另一個(gè)的兩倍多?
經(jīng)過一段時(shí)間的思考,我意識到主要的區(qū)別是:在普通卷積中,我們對圖像進(jìn)行了256次變換。每個(gè)變換都要用到5x5x3x8x8=4800次乘法。在可分離卷積中,我們只對圖像做一次變換——在深度卷積中。然后,我們將轉(zhuǎn)換后的圖像簡單地延長到256通道。不需要一遍又一遍地變換圖像,我們可以節(jié)省計(jì)算能力。
值得注意的是,在Keras和Tensorflow中,都有一個(gè)稱為“深度乘法器”的參數(shù)。默認(rèn)設(shè)置為1。通過改變這個(gè)參數(shù),我們可以改變深度卷積中輸出通道的數(shù)量。例如,如果我們將深度乘法器設(shè)置為2,每個(gè)5x5x1內(nèi)核將輸出8x8x2的圖像,使深度卷積的總輸出(堆疊)為8x8x6,而不是8x8x3。有些人可能會選擇手動設(shè)置深度乘法器來增加神經(jīng)網(wǎng)絡(luò)中的參數(shù)數(shù)量,以便更好地學(xué)習(xí)更多的特征。
深度可分離卷積的缺點(diǎn)是什么?當(dāng)然!因?yàn)樗鼫p少了卷積中參數(shù)的數(shù)量,如果你的網(wǎng)絡(luò)已經(jīng)很小,你可能會得到太少的參數(shù),你的網(wǎng)絡(luò)可能無法在訓(xùn)練中正確學(xué)習(xí)。然而,如果使用得當(dāng),它可以在不顯著降低效率的情況下提高效率,這使得它成為一個(gè)非常受歡迎的選擇。
1x1內(nèi)核:
最后,由于逐點(diǎn)卷積使用了這個(gè)概念,我想討論一下1x1內(nèi)核的用法。
一個(gè)1x1內(nèi)核——或者更確切地說,n個(gè)1x1xm內(nèi)核,其中n是輸出通道的數(shù)量,m是輸入通道的數(shù)量——可以在可分離卷積之外使用。1x1內(nèi)核的一個(gè)明顯目的是增加或減少圖像的深度。如果你發(fā)現(xiàn)卷積有太多或太少的通道,1x1核可以幫助平衡它。
然而,對我來說,1x1核的主要目的是應(yīng)用非線性。在神經(jīng)網(wǎng)絡(luò)的每一層之后,我們都可以應(yīng)用一個(gè)激活層。無論是ReLU、PReLU、Softmax還是其他,與卷積層不同,激活層是非線性的。直線的線性組合仍然是直線。非線性層擴(kuò)展了模型的可能性,這也是通常使“深度”網(wǎng)絡(luò)優(yōu)于“寬”網(wǎng)絡(luò)的原因。為了在不顯著增加參數(shù)和計(jì)算量的情況下增加非線性層的數(shù)量,我們可以應(yīng)用一個(gè)1x1內(nèi)核并在它之后添加一個(gè)激活層。這有助于給網(wǎng)絡(luò)增加一層深度。
參考鏈接:https://ai.yanxishe.com/page/TextTranslation/1639
總結(jié)
以上是生活随笔為你收集整理的【深度学习】 - MobileNet使用的可分离卷积的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基金经理谢家乐怎么样?基金经理谢家乐有哪
- 下一篇: 办信用卡哪家银行好 信用卡哪个银行好办