深度學(xué)習(xí)100問(wèn) Author:louwill Machine Learning Lab 在前面五篇文章的準(zhǔn)備之后,從今天開(kāi)始,我們就正式進(jìn)入深度學(xué)習(xí)的主題。我們今天的主題是卷積(Convlution)。想必熟悉CNN的你一定對(duì)卷積很熟悉了,或許也聽(tīng)過(guò)用過(guò)深度學(xué)習(xí)可分離卷積、轉(zhuǎn)置卷積等概念和方法。那么目前為止,深度學(xué)習(xí)中都有哪些典型的卷積方式?本篇筆者就和大家一起來(lái)總結(jié)一下這些功能強(qiáng)大的卷積。本文的目錄如下:
卷積的本質(zhì) 在具體介紹各種卷積之前,我們有必要再來(lái)回顧一下卷積的真實(shí)含義,從數(shù)學(xué)和圖像處理應(yīng)用的意義上來(lái)看一下卷積到底是什么操作。目前大多數(shù)深度學(xué)習(xí)教程很少對(duì)卷積的含義進(jìn)行細(xì)述,大部分只是對(duì)圖像的卷積操作進(jìn)行了闡述。以至于卷積的數(shù)學(xué)意義和物理意義很多人并不是很清楚,究竟為什么要這樣設(shè)計(jì),這么設(shè)計(jì)的原因如何。 追本溯源,我們先回到數(shù)學(xué)教科書(shū)中來(lái)看卷積。在泛函分析中,卷積也叫旋積或者褶積,是一種通過(guò)兩個(gè)函數(shù)x(t)和h(t)生成的數(shù)學(xué)算子。其計(jì)算公式如下: 連續(xù)形式: 離散形式: 公式寫(xiě)的很清楚了,兩個(gè)函數(shù)的卷積就是先將一個(gè)函數(shù)進(jìn)行翻轉(zhuǎn)(Reverse),然后再做一個(gè)平移(Shift),這便是'卷'的含義。而'積'就是將平移后的兩個(gè)函數(shù)對(duì)應(yīng)元素相乘求和。所以卷積本質(zhì)上就是一個(gè)Reverse-Shift-Weighted Summation的操作。 數(shù)無(wú)形時(shí)少直觀。我們用兩個(gè)函數(shù)圖像來(lái)直觀的展示卷積過(guò)程和含義。兩個(gè)函數(shù)x(t)和h(t)的圖像如下圖所示: 我們先對(duì)其中一個(gè)函數(shù)h(t)進(jìn)行翻轉(zhuǎn)(Reverse)操作: 然后進(jìn)行平移(Shift): 以上過(guò)程是為'卷'。然后是'積'的過(guò)程,因?yàn)槭沁B續(xù)函數(shù),這里相乘求和為積分形式,圖中綠色部分即為相乘求和部分。 圖像來(lái)自: http://fourier.eng./e161/lectures/convolution/index.html 那么為什么要卷積?直接元素相乘不好嗎?就圖像的卷積操作而言,筆者認(rèn)為卷積能夠更好提取區(qū)域特征,使用不同大小的卷積算子能夠提取圖像各個(gè)尺度的特征。卷積在信號(hào)處理、圖像處理等領(lǐng)域有著廣泛的應(yīng)用。當(dāng)然,之于深度學(xué)習(xí)而言,卷積神經(jīng)網(wǎng)絡(luò)主要用于圖像領(lǐng)域?;仡櫫司矸e的本質(zhì)之后,我們?cè)賮?lái)一一梳理CNN中典型的卷積操作。 常規(guī)卷積 我們從最原始的圖像卷積操作開(kāi)始。因?yàn)閳D像有單通道圖像(灰度圖)和多通道圖(RGB圖),所以對(duì)應(yīng)常規(guī)卷積方式可以分為單通道卷積和多通道卷積。二者本質(zhì)上并無(wú)太大差異,無(wú)非對(duì)每個(gè)通道都要進(jìn)行卷積而已。先來(lái)看單通道卷積。 在單通道卷積中,針對(duì)圖像的像素矩陣,卷積操作就是用一個(gè)卷積核來(lái)逐行逐列的掃描像素矩陣,并與像素矩陣做元素相乘,以此得到新的像素矩陣。其中卷積核也叫過(guò)濾器或者濾波器,濾波器在輸入像素矩陣上掃過(guò)的面積稱(chēng)之為感受野。假設(shè)輸入圖像維度為n*n*c,濾波器維度為f*f*n,卷積步長(zhǎng)為s,padding大小為p,那么輸出維度可以計(jì)算為: 一個(gè)標(biāo)準(zhǔn)的單通道卷積如下圖所示: 圖像來(lái)自: https:///intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1 我們這里沒(méi)有加入padding和stride等卷積要素,僅僅是為了說(shuō)明一般的卷積過(guò)程。那么如何理解多通道(3通道)卷積呢?其實(shí)也很簡(jiǎn)單。比如說(shuō)我們現(xiàn)在有一個(gè)5*5*3的RGB 3通道圖像,我們可以將其看成是3張5*5圖像的堆疊,這時(shí)候我們把原先的單通道濾波器*3,用3個(gè)濾波器分別對(duì)著三張圖像進(jìn)行卷積,將卷積得到三個(gè)特征圖加總起來(lái)便是最后結(jié)果。這里強(qiáng)調(diào)一點(diǎn):濾波器的通道數(shù)一定要跟輸入圖像的通道數(shù)一致,不然會(huì)漏下某些通道得不到卷積?,F(xiàn)在我們用3*3*3的濾波器對(duì)5*5*3的輸入進(jìn)行卷積,得到的輸出維度為3*3。這里少了通道數(shù),所以一般我們會(huì)用多個(gè)3通道濾波器來(lái)進(jìn)行卷積,假設(shè)我們這里用了10個(gè)3*3*3的濾波器,那最后的輸出便為3*3*10,濾波器的個(gè)數(shù)變成了輸出特征圖的通道數(shù)。 圖像來(lái)自: https:///a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215 我們也可以從3D的角度來(lái)理解多通道卷積:我們可以將3*3*3的濾波器想象為一個(gè)三維的立方體,為了計(jì)算立方體濾波器在輸入圖像上的卷積操作,我們首先將這個(gè)三維的濾波器放到左上角,讓三維濾波器的27個(gè)數(shù)依次乘以紅綠藍(lán)三個(gè)通道中的像素?cái)?shù)據(jù),即濾波器的前9個(gè)數(shù)乘以紅色通道中的數(shù)據(jù),中間9個(gè)數(shù)乘以綠色通道中的數(shù)據(jù),最后9個(gè)數(shù)乘以藍(lán)色通道中的數(shù)據(jù)。將這些數(shù)據(jù)加總起來(lái),就得到輸出像素的第一個(gè)元素值。示意圖如下所示: 圖像來(lái)自: https:///a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215 3D卷積 將2D卷積增加一個(gè)深度維便可擴(kuò)展為3D卷積。輸入圖像是3維的,濾波器也是3維的,對(duì)應(yīng)的卷積輸出同樣是3維的。操作示意圖如下: 可以想象一下3D卷積的動(dòng)態(tài)圖。用一個(gè)2*2*2的3D濾波器對(duì)一個(gè)4*4*4的輸入圖像進(jìn)行3D卷積,可以得到一個(gè)3*3*3的輸出。 我們可以把2D卷積的計(jì)算輸出公式進(jìn)行擴(kuò)展,可以得到3D卷積的輸出維度計(jì)算公式。假設(shè)輸入圖像大小為a1*a2*a3,通道數(shù)為c,過(guò)濾器大小為f*f*f*c,濾波器數(shù)量為n,則輸出維度可以表示為: 3D卷積在醫(yī)學(xué)影像數(shù)據(jù)、視頻分類(lèi)等領(lǐng)域都有著較為廣泛的應(yīng)用。相較于2D卷積,3D卷積的一個(gè)特點(diǎn)就是卷積計(jì)算量巨大,對(duì)計(jì)算資源要求相對(duì)較高。 轉(zhuǎn)置卷積 轉(zhuǎn)置卷積(Transposed Convolution)也叫解卷積(Deconvolution),有些人也將其稱(chēng)為反卷積,但這個(gè)叫法并不太準(zhǔn)確。大家都知道,在常規(guī)卷積時(shí),我們每次得到的卷積特征圖尺寸是越來(lái)越小的。但在圖像分割等領(lǐng)域,我們是需要逐步恢復(fù)輸入時(shí)的尺寸的。如果把常規(guī)卷積時(shí)的特征圖不斷變小叫做下采樣,那么通過(guò)轉(zhuǎn)置卷積來(lái)恢復(fù)分辨率的操作可以稱(chēng)作上采樣。 本質(zhì)上來(lái)說(shuō),轉(zhuǎn)置卷積跟常規(guī)卷積并無(wú)區(qū)別。不同之處在于先按照一定的比例進(jìn)行padding來(lái)擴(kuò)大輸入尺寸,然后把常規(guī)卷積中的卷積核進(jìn)行轉(zhuǎn)置,再按常規(guī)卷積方法進(jìn)行卷積就是轉(zhuǎn)置卷積。假設(shè)輸入圖像矩陣為X,卷積核矩陣為C,常規(guī)卷積的輸出為Y,則有: 兩邊同時(shí)乘以卷積核的轉(zhuǎn)置CT,這個(gè)公式便是轉(zhuǎn)置卷積的輸入輸出計(jì)算。 假設(shè)輸入大小為4*4,濾波器大小為3*3,常規(guī)卷積下輸出為2*2,為了演示轉(zhuǎn)置卷積,我們將濾波器矩陣進(jìn)行稀疏化處理為4*16,將輸入矩陣進(jìn)行拉平為16*1,相應(yīng)輸出結(jié)果也會(huì)拉平為4*1,圖示如下: 然后按照轉(zhuǎn)置卷積的做法我們把卷積核矩陣進(jìn)行轉(zhuǎn)置,按照X=CTY進(jìn)行驗(yàn)證: 圖像來(lái)自: https:///intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1 關(guān)于轉(zhuǎn)置卷積的最后一個(gè)問(wèn)題是輸入輸出尺寸計(jì)算。我們將常規(guī)卷積的計(jì)算公式轉(zhuǎn)化一下即可得到轉(zhuǎn)置卷積的換算公式: 第一個(gè)公式就是上面提到的常規(guī)卷積的輸入輸出換算公式,第二個(gè)公式為轉(zhuǎn)置卷積的輸入輸出換算公式。其中,s常規(guī)卷積步長(zhǎng),p是常規(guī)卷積的padding,f為濾波器大小。雖說(shuō)公式推導(dǎo)起來(lái)簡(jiǎn)單,但考慮到(w2+2p-f)/s極有可能出現(xiàn)不能整除的情況,所以常規(guī)卷積和轉(zhuǎn)置卷積之間的轉(zhuǎn)換關(guān)系就需要分為兩種情況。 第一種就是可以直接整除的。即當(dāng)(w2+2p-f)%s=0時(shí),常規(guī)卷積與轉(zhuǎn)置卷積之間的換算關(guān)系。我們以一組無(wú)padding條件下常規(guī)卷積和轉(zhuǎn)置卷積的對(duì)比動(dòng)圖: 常規(guī)卷積 轉(zhuǎn)置卷積 圖像來(lái)自: https://github.com/vdumoulin/conv_arithmetic 在上圖常規(guī)卷積中,輸入為2*2,濾波器為3*3,根據(jù)上述第一個(gè)公式可得輸出為(4+2*0-3)/1 + 1=2,這時(shí)候是可以整除的,所以輸出為2*2。對(duì)應(yīng)到轉(zhuǎn)置卷積中:1*(2-1)+3-2*0=4,即轉(zhuǎn)置卷積的輸出為4*4。 第二種就是略微復(fù)雜一點(diǎn)的不能整除的情況。常規(guī)卷積時(shí)不能整除的情況也叫odd卷積。即當(dāng)(w2+2p-f)%s!=0時(shí),常規(guī)卷積與轉(zhuǎn)置卷積之間的換算關(guān)系如何。在進(jìn)行odd卷積時(shí),遇到不能整除的情況下我們通過(guò)會(huì)進(jìn)行取整操作,因而在常規(guī)卷積時(shí)有時(shí)候會(huì)忽略一小部分像素沒(méi)有進(jìn)行卷積,這在轉(zhuǎn)置卷積時(shí)需要加回來(lái)。我們同樣以一組odd卷積例子來(lái)進(jìn)行說(shuō)明。 odd常規(guī)卷積 odd轉(zhuǎn)置卷積 圖像來(lái)自: https://github.com/vdumoulin/conv_arithmetic 如上圖所示。在odd常規(guī)卷積中,我們用一個(gè)3*3的濾波器對(duì)6*6的輸入進(jìn)行卷積,padding=1,stride=2,根據(jù)公式(6+2*1-3)/2,發(fā)現(xiàn)不能整除,這里我們?nèi)≌麨?,那么輸出特征圖大小為3*3。因?yàn)樽隽巳≌僮?,大家可以看到圖中最右邊一列和最下邊一行的padding是沒(méi)有加入到卷積計(jì)算中的。這部分因取整而舍去的數(shù)據(jù)需要我們?cè)谵D(zhuǎn)置卷積時(shí)給加回來(lái)。所以,對(duì)應(yīng)的轉(zhuǎn)置卷積的輸入輸出換算公式可以更改為: 在上圖中,我們輸入尺寸為3*3,卷積濾波器大小也為3*3,padding為1,但這里stride等于2,有同學(xué)可能會(huì)問(wèn),圖中卷積核明明只移動(dòng)一個(gè)步長(zhǎng)啊為啥stride=2?圖中確實(shí)只移動(dòng)了一個(gè)步長(zhǎng),但大家可以注意到我們輸入里插入了很多白色塊,也就是0,從當(dāng)前元素值移動(dòng)到下一個(gè)元素值,實(shí)際上是經(jīng)過(guò)兩個(gè)步長(zhǎng)的。所以,這里的輸出尺寸為2*(3-1)+3-2*1+1=6。這便是轉(zhuǎn)置卷積。 1x1卷積 1x1卷積的偉大發(fā)明來(lái)自于2014年GoogLeNet的inception v1,其主要作用在于可以降維節(jié)省計(jì)算成本。1x1卷積在卷積方式上與常規(guī)卷積并無(wú)差異,主要在于其應(yīng)用場(chǎng)景和功能。 inception v1模塊 下面我們來(lái)看1x1卷積到底有什么功效。假設(shè)現(xiàn)在我們有28*28*192的輸入,使用32個(gè)5*5*192的卷積核對(duì)其進(jìn)行卷積,那么輸出為28*28*32,好像沒(méi)什么特別之處。我們來(lái)看一下它的計(jì)算量,對(duì)于輸出中的每一個(gè)元素值都要執(zhí)行5*5*192次計(jì)算,所以這次卷積的計(jì)算量為:28*28*32*5*5*192=120422400。5*5卷積的運(yùn)算量直接上億了。 那現(xiàn)在看看1x1卷積會(huì)如何。我們先用16個(gè)1*1*192的卷積核對(duì)輸入進(jìn)行卷積,輸出尺寸為28*28*16,再用32個(gè)5*5*16的卷積核對(duì)其進(jìn)行卷積,輸出為28*28*32。經(jīng)歷兩次卷積同樣得到28*28*32的輸出,來(lái)看一下其中的計(jì)算量。第一次卷積:28*28*16*192=2408448,第二次卷積28*28*32*5*5*16=10035200,兩次卷積合計(jì)計(jì)算量約為120萬(wàn),將較于直接的5*5卷積,1x1卷積的計(jì)算量直接減少了10倍,能夠在保證網(wǎng)絡(luò)性能的情況下極大幅度的節(jié)約計(jì)算成本。這便是1x1卷積。 深度可分離卷積 從維度的角度看,卷積核可以看成是一個(gè)空間維(寬和高)和通道維的組合,而卷積操作則可以視為空間相關(guān)性和通道相關(guān)性的聯(lián)合映射。從inception的1x1卷積來(lái)看,卷積中的空間相關(guān)性和通道相關(guān)性是可以解耦的,將它們分開(kāi)進(jìn)行映射,可能會(huì)達(dá)到更好的效果。 深度可分離卷積是在1x1卷積基礎(chǔ)上的一種創(chuàng)新。主要包括兩個(gè)部分:深度卷積和1x1卷積。深度卷積的目的在于對(duì)輸入的每一個(gè)通道都單獨(dú)使用一個(gè)卷積核對(duì)其進(jìn)行卷積,也就是通道分離后再組合。1x1卷積的目的則在于加強(qiáng)深度。下面以一個(gè)例子來(lái)看一下深度可分離卷積。 假設(shè)我們用128個(gè)3*3*3的濾波器對(duì)一個(gè)7*7*3的輸入進(jìn)行卷積,可得到5*5*128的輸出。如下圖所示: 圖像來(lái)自: https:///intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1 其計(jì)算量為5*5*128*3*3*3=86400。 現(xiàn)在看如何使用深度可分離卷積來(lái)實(shí)現(xiàn)同樣的結(jié)果。深度可分離卷積的第一步是深度卷積。這里的深度卷積,就是分別用3個(gè)3*3*1的濾波器對(duì)輸入的3個(gè)通道分別做卷積,也就是說(shuō)要做3次卷積,每次卷積都有一個(gè)5*5*1的輸出,組合在一起便是5*5*3的輸出。 現(xiàn)在為了拓展深度達(dá)到128,我們需要執(zhí)行深度可分離卷積的第二步:1x1卷積?,F(xiàn)在我們用128個(gè)1*1*3的濾波器對(duì)5*5*3進(jìn)行卷積,就可以得到5*5*128的輸出。完整過(guò)程如下圖所示: 圖像來(lái)自: https:///intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1 那么我們來(lái)看一下深度可分離卷積的計(jì)算量如何。第一步深度卷積的計(jì)算量:5*5*1*3*3*1*3=675。第二步1x1卷積的計(jì)算量:5*5*128*1*1*3=9600,合計(jì)計(jì)算量為10275次??梢?jiàn),相同的卷積計(jì)算輸出,深度可分離卷積要比常規(guī)卷積節(jié)省12倍的計(jì)算成本。 典型的應(yīng)用深度可分離卷積的網(wǎng)絡(luò)模型包括xception和mobilenet等。本質(zhì)上而言,xception就是應(yīng)用了深度可分離卷積的inception網(wǎng)絡(luò)。 空洞卷積 空洞卷積也叫擴(kuò)張卷積或者膨脹卷積,簡(jiǎn)單來(lái)說(shuō)就是在卷積核元素之間加入一些空格(零)來(lái)擴(kuò)大卷積核的過(guò)程。我們用一個(gè)擴(kuò)展率a來(lái)表示卷積核擴(kuò)張的程度。比如說(shuō)a=1,2,4的時(shí)候卷積核核感受野如下圖所示: 圖像來(lái)自: https:///intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1 加入空洞之后的實(shí)際卷積核尺寸與原始卷積核尺寸之間的關(guān)系: 其中k為原始卷積核大小,a為卷積擴(kuò)展率,K為經(jīng)過(guò)擴(kuò)展后實(shí)際卷積核大小。除此之外,空洞卷積的卷積方式跟常規(guī)卷積一樣。a=2時(shí)的空洞卷積的動(dòng)態(tài)示意圖如下所示: 圖像來(lái)自: https://github.com/vdumoulin/conv_arithmetic 那么空洞卷積有什么好處呢?一個(gè)直接作用就是可以擴(kuò)大卷積感受野,空洞卷積幾乎可以在零成本的情況下就可以獲取更大的感受野來(lái)擴(kuò)充更多信息,這有助于在檢測(cè)和分割任務(wù)中提高準(zhǔn)確率??斩淳矸e的另一個(gè)優(yōu)點(diǎn)則是可以捕捉多尺度的上下文信息,當(dāng)我們使用不同的擴(kuò)展率來(lái)進(jìn)行卷積核疊加時(shí),獲取的感受野就豐富多樣。 以上就是本節(jié)內(nèi)容,稍微有點(diǎn)多,但萬(wàn)變不離其宗,稍加注意便可掌握。 有學(xué)術(shù)和技術(shù)問(wèn)題的同學(xué)可以加我微信進(jìn)入機(jī)器學(xué)習(xí)實(shí)驗(yàn)室讀者交流群。加微信后說(shuō)明來(lái)意,最好做個(gè)簡(jiǎn)單的自我介紹,讓我有個(gè)印象,加了一言不發(fā)不如不加。 參考資料: |
|
來(lái)自: LibraryPKU > 《機(jī)器學(xué)習(xí)》