0
本文作者: 叢末 | 2019-02-20 09:43 |
雷鋒網(wǎng) AI 科技評(píng)論按:深度學(xué)習(xí)中的各種卷積網(wǎng)絡(luò)大家知多少?對(duì)于那些聽(tīng)說(shuō)過(guò)卻又對(duì)它們沒(méi)有特別清晰的認(rèn)識(shí)的小伙伴們,Kunlun Bai 這篇文章非常值得一讀。Kunlun Bai 是一位人工智能、機(jī)器學(xué)習(xí)、物體學(xué)以及工程學(xué)領(lǐng)域的研究型科學(xué)家,在本文中,他詳細(xì)地介紹了 2D、3D、1x1 、轉(zhuǎn)置 、空洞(擴(kuò)張)、空間可分離、深度可分離、扁平化、 分組等十多種卷積網(wǎng)絡(luò)類(lèi)型。雷鋒網(wǎng) AI 科技評(píng)論編譯如下。
如果你曾聽(tīng)過(guò)深度學(xué)習(xí)的各種卷積網(wǎng)絡(luò)(例如 2D/3D/ 1x1 / 轉(zhuǎn)置 /空洞(擴(kuò)張)/ 空間可分離 / 深度可分離 /扁平化 / 分組 / 混洗分組卷積)并疑惑它們到底都是什么的話,你可以通過(guò)這篇文章了解它們實(shí)際的工作原理。
在文中,我概括性地介紹了在深度學(xué)習(xí)中常見(jiàn)的幾種卷積,并采用了大家都能夠明白的方式來(lái)解釋它們。針對(duì)這一主題,這篇文章以外也有其他的一些文章可供大家參考,我將這些文章的鏈接附在了文末參考部分,大家可前往閱讀。
希望這篇文章能夠幫助大家建立起對(duì)這幾種卷積的認(rèn)知,并為大家的學(xué)習(xí)/研究帶來(lái)有用的參考價(jià)值。
本文的內(nèi)容包括:
1. 卷積 VS 互關(guān)聯(lián)
2. 深度學(xué)習(xí)中的卷積網(wǎng)絡(luò)(單通道版,多通道版)
3.3D 卷積
4. 1x1 卷積
5. 卷積算法
6. 轉(zhuǎn)置卷積(反卷積,棋盤(pán)效應(yīng))
7. 空洞卷積(擴(kuò)張卷積)
8. 可分離卷積(空間可分離 卷積,深度可分離卷積)
9. 扁平化卷積
10. 分組卷積
11. 混洗分組卷積
12. 逐點(diǎn)分組卷積
卷積是一項(xiàng)廣泛應(yīng)用于信號(hào)處理、圖像處理以及其他工程/科學(xué)領(lǐng)域的技術(shù)。在深度學(xué)習(xí)中,卷積神經(jīng)網(wǎng)絡(luò)(CNN)這一模型架構(gòu)就由這項(xiàng)技術(shù)命名的。然而,深度學(xué)習(xí)中的卷積本質(zhì)上就是信號(hào)/圖像處理中的互關(guān)聯(lián)(cross-correlation)。二者間只有細(xì)微的差別。
不深入考慮細(xì)節(jié)的話,二者的區(qū)別在于:在信號(hào)/圖像處理中,卷積被定義為:
它的定義是:一個(gè)函數(shù)經(jīng)過(guò)翻轉(zhuǎn)和移動(dòng)后與另一個(gè)函數(shù)的乘積的積分。下面的圖像形象化地展示了這個(gè)思想:
信號(hào)處理中的卷積。過(guò)濾函數(shù) g 經(jīng)過(guò)翻轉(zhuǎn)然后沿著橫軸滑動(dòng)。對(duì)于該函數(shù)在橫軸上滑過(guò)的每個(gè)點(diǎn)的位置,都計(jì)算出函數(shù) f 與翻轉(zhuǎn)后的函數(shù) g 的重合區(qū)域。這個(gè)重合的區(qū)域就是函數(shù) g 在橫軸上滑過(guò)的某個(gè)特定位置的卷積值。圖像來(lái)源:http://fourier.eng.hmc.edu/e161/lectures/convolution/index.html
在這里,函數(shù) g 是一個(gè)過(guò)濾函數(shù)。這個(gè)函數(shù)經(jīng)過(guò)翻轉(zhuǎn)然后沿著橫軸滑動(dòng)。對(duì)于該函數(shù)在橫軸上滑過(guò)的每個(gè)點(diǎn)的位置,都計(jì)算出函數(shù) f 與翻轉(zhuǎn)后的函數(shù) g 的重合區(qū)域。這個(gè)重合的區(qū)域就是函數(shù) g 在橫軸上滑過(guò)的某個(gè)特定位置的卷積值。
而另一方面,互關(guān)聯(lián)是這兩個(gè)函數(shù)的滑動(dòng)的點(diǎn)積(dot product)或滑動(dòng)的內(nèi)積(inner-product)?;リP(guān)聯(lián)的過(guò)濾函數(shù)不經(jīng)過(guò)翻轉(zhuǎn),它直接滑動(dòng)通過(guò)函數(shù) f。函數(shù) f 和函數(shù) g 的重合區(qū)域就是互關(guān)聯(lián)。下圖展示了卷積和互關(guān)聯(lián)的區(qū)別:
在信號(hào)處理中,卷積和互關(guān)聯(lián)的區(qū)別。圖像來(lái)源:https://en.wikipedia.org/wiki/Convolution
在深度學(xué)習(xí)中,卷積中的過(guò)濾函數(shù)是不經(jīng)過(guò)翻轉(zhuǎn)的。嚴(yán)格來(lái)說(shuō),它就是互關(guān)聯(lián)。我們本質(zhì)上就是在執(zhí)行 element-wise 乘法和加法。但是,這個(gè)「卷積」僅在深度學(xué)習(xí)中被稱(chēng)為卷積,可以這樣做的原因是因?yàn)榫矸e在訓(xùn)練期間就學(xué)到了過(guò)濾函數(shù)的權(quán)重,如果上面示例中的經(jīng)翻轉(zhuǎn)的函數(shù) g 是正確的函數(shù),那么經(jīng)過(guò)訓(xùn)練后,卷積所學(xué)到的過(guò)濾函數(shù)就會(huì)找到翻轉(zhuǎn)后的函數(shù) g。因此,在正確的卷積中,就不需要在訓(xùn)練前早早地翻轉(zhuǎn)過(guò)濾函數(shù)。
執(zhí)行卷積的目的就是從輸入中提取有用的特征。在圖像處理中,執(zhí)行卷積操作有諸多不同的過(guò)濾函數(shù)可供選擇,每一種都有助于從輸入圖像中提取不同的方面或特征,如水平/垂直/對(duì)角邊等。類(lèi)似地,卷積神經(jīng)網(wǎng)絡(luò)通過(guò)卷積在訓(xùn)練期間使用自動(dòng)學(xué)習(xí)權(quán)重的函數(shù)來(lái)提取特征。所有這些提取出來(lái)的特征,之后會(huì)被「組合」在一起做出決策。
進(jìn)行卷積操作有許多優(yōu)勢(shì),例如權(quán)重共享(weights sharing)和平移不變性(translation invariant)。此外,卷積也可以考慮到像素的空間關(guān)系。這些優(yōu)勢(shì)都非常有幫助,尤其是在許多的計(jì)算機(jī)視覺(jué)任務(wù)中,因?yàn)檫@些任務(wù)往往涉及到對(duì)某些組成部分與其他組成部分有某些空間關(guān)系的目標(biāo)進(jìn)行識(shí)別(例如一只狗的身體通常是跟它的腦袋、四條腿以及尾巴相連的)。
2.1 卷積:?jiǎn)瓮ǖ腊?/span>
面向單通道的卷積,圖像源自:https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1
在深度學(xué)習(xí)中,卷積就是元素級(jí)別( element-wise) 的乘法和加法。對(duì)于一張僅有 1 個(gè)通道的圖像,卷積過(guò)程如上圖所示,過(guò)濾函數(shù)是一個(gè)組成部分為 [[0, 1, 2], [2, 2, 0], [0, 1, 2]] 的 3 x 3 矩陣,它滑動(dòng)穿過(guò)整個(gè)輸入。在每一個(gè)位置,它都執(zhí)行了元素級(jí)別的乘法和加法,而每個(gè)滑過(guò)的位置都得出一個(gè)數(shù)字,最終的輸出就是一個(gè) 3 x 3 矩陣。(注意:在這個(gè)示例中,卷積步長(zhǎng)=1;填充=0。我會(huì)在下面的算法部分介紹這些概念。)
2.2 卷積:多通道版
在許多應(yīng)用中,我們處理的是多通道的圖像。一個(gè)典型的案例就是 RGB 圖像,如下圖所示,每一個(gè) RGB 通道都分別著重于原始圖像的不同方面。
每一個(gè) RGB 通道都分別著重于原始圖像的不同方面,圖片拍攝于:中國(guó)云南元陽(yáng)
另一個(gè)多通道數(shù)據(jù)的案例就是卷積神經(jīng)網(wǎng)絡(luò)中的層。一個(gè)卷積網(wǎng)絡(luò)層往往都由多個(gè)通道(一般為數(shù)百個(gè)通道)組成,每一個(gè)通道描述出前一個(gè)層的不同方面。那我們?nèi)绾螌?shí)現(xiàn)不同深度的層之間的過(guò)渡呢?又如何將深度為 n 的層轉(zhuǎn)化為后面的深度為 m 的層呢?
在介紹這個(gè)過(guò)程之前,我們先搞清楚幾個(gè)名詞:層(layer)、通道(channel)、特征映射(feature map)、過(guò)濾器(filter)以及卷積核(kernel)。從層級(jí)角度來(lái)說(shuō),「層」和「過(guò)濾器」的概念屬于一個(gè)層級(jí),而「通道」和「卷積核」都在下一個(gè)層級(jí)?!竿ǖ馈购汀柑卣饔成洹故侵竿粋€(gè)東西。一層可以有多個(gè)通道(或特征映射);如果輸入的是 RGB 圖像,那這個(gè)輸入層有 3 個(gè)通道?!竿ǖ馈挂话阌脕?lái)形容「層」的架構(gòu)。類(lèi)似地,「卷積核」則用來(lái)形容「過(guò)濾器」的架構(gòu)。
「層」(「過(guò)濾器」)和「通道」(「卷積核」)之間的區(qū)別
過(guò)濾器和卷積核之間的區(qū)別非常微妙,有時(shí)候,二者可以交替使用,這無(wú)疑就制造了些困惑。但根本上來(lái)講,二者還是有些細(xì)微區(qū)別的:「卷積核」指的是指權(quán)重組成的 2D 數(shù)組 ;「過(guò)濾器」則是由多個(gè)卷積核堆疊在一起的 3D 架構(gòu)概念。對(duì)于一個(gè) 2D 過(guò)濾器來(lái)說(shuō),過(guò)濾器就相當(dāng)于卷積核,但是對(duì)于一個(gè) 3D 過(guò)濾器以及深度學(xué)習(xí)中的大多數(shù)卷積而言,一個(gè)過(guò)濾器由一組卷積核組成。每個(gè)卷積核都是獨(dú)一無(wú)二的,強(qiáng)調(diào)了輸入通道的不同方面。
帶著對(duì)這些概念的了解,下面讓我們一起來(lái)看看多通道卷積。生成一個(gè)輸出通道,就需要將每一個(gè)卷積核應(yīng)用到前一層的輸出通道上,這是一個(gè)卷積核級(jí)別的操作過(guò)程。我們對(duì)所有的卷積核都重復(fù)這個(gè)過(guò)程以生成多通道,之后,這些通道組合在一起共同形成一個(gè)單輸出通道。下圖可以讓大家更清晰地看到這個(gè)過(guò)程。
這里假設(shè)輸入層是一個(gè) 5 x 5 x 3 矩陣,它有 3 個(gè)通道。過(guò)濾器則是一個(gè) 3 x 3 x 3 矩陣。首先,過(guò)濾器中的每個(gè)卷積核都應(yīng)用到輸入層的 3 個(gè)通道,執(zhí)行 3 次卷積后得到了尺寸為 3 x 3 的 3 個(gè)通道。
面向多通道的 2D 卷積的第一步:過(guò)濾器每個(gè)卷積核分別應(yīng)用到輸入層的 3 個(gè)通道上。圖片源自:https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1
之后,這 3 個(gè)通道都合并到一起(元素級(jí)別的加法)組成了一個(gè)大小為 3 x 3 x 1 的單通道。這個(gè)通道是輸入層(5 x 5 x 3 矩陣)使用了過(guò)濾器(3 x 3 x 3 矩陣)后得到的結(jié)果。
面向多通道的 2D 卷積的第二步:3 個(gè)通道都合并到一起(元素級(jí)別的加法)組成了一個(gè)大小為 3 x 3 x 1 的單通道。圖片源自:https://towardsdatascience.com/intuitively-understanding-convolutions-for-deep-learning-1f6f42faee1
同樣地,我們可以將這個(gè)過(guò)程視作將一個(gè) 3D 過(guò)濾器矩陣滑動(dòng)通過(guò)輸入層。注意,這個(gè)輸入層和過(guò)濾器的深度都是相同的(即通道數(shù)=卷積核數(shù))。這個(gè) 3D 過(guò)濾器僅沿著 2 個(gè)方向(圖像的高&寬)移動(dòng)(這也是為什么 3D 過(guò)濾器即使通常用于處理 3D 體積數(shù)據(jù),但這樣的操作還是被稱(chēng)為 2D 卷積)。在每一個(gè)滑過(guò)的位置,我們都執(zhí)行元素級(jí)別的乘法和加法,最終得出一個(gè)數(shù)值。下面這個(gè)例子中,過(guò)濾器橫向滑過(guò) 5 個(gè)位置、縱向滑過(guò) 5 個(gè)位置。全部完成后,我們得到了一個(gè)單輸出通道。
看待 2D 卷積的另一個(gè)角度:將這個(gè)過(guò)程視作將一個(gè) 3D 過(guò)濾器矩陣滑動(dòng)通過(guò)輸入層。注意,這個(gè)輸入層和過(guò)濾器的深度都是相同的(即通道數(shù)=卷積核數(shù))。這個(gè) 3D 過(guò)濾器僅沿著 2 個(gè)方向(圖像的高&寬)移動(dòng)(這也是為什么 3D 過(guò)濾器即使通常用于處理 3D 體積數(shù)據(jù),但這樣的操作還是被稱(chēng)為 2D 卷積)。輸出是一個(gè) 1 層的矩陣。
現(xiàn)在我們可以看到如何在不同深度的層之間實(shí)現(xiàn)過(guò)渡。假設(shè)輸入層有 Din 個(gè)通道,而想讓輸出層的通道數(shù)量變成 Dout ,我們需要做的僅僅是將 Dout 個(gè)過(guò)濾器應(yīng)用到輸入層中。每一個(gè)過(guò)濾器都有 Din 個(gè)卷積核,都提供一個(gè)輸出通道。在應(yīng)用 Dout 個(gè)過(guò)濾器后,Dout 個(gè)通道可以共同組成一個(gè)輸出層。
標(biāo)準(zhǔn) 2D 卷積。通過(guò)使用 Dout 個(gè)過(guò)濾器,將深度為 Din 的層映射為另一個(gè)深度為 Dout 的層。
在上部分的最后一張圖中,我們看到了將卷積在 3D 體積上的執(zhí)行情況。但是一般而言,我們依舊將這一操作視為深度學(xué)習(xí)中的 2D 卷積——3D 體積數(shù)據(jù)上的 2D 卷積:其過(guò)濾器和輸入層的深度是一樣的;3D 過(guò)濾器僅沿著 2 個(gè)方向(圖像的高&寬)移動(dòng)。這樣操作得出的結(jié)果就是一個(gè) 2D 圖像(僅有 1 個(gè)通道)。
有 2D 卷積,自然就有 3D 卷積。3D 卷積是 2D 卷積的一般化。在 3D 卷積中,過(guò)濾器的深度要比輸入層的深度更小(卷積核大小<通道大?。Y(jié)果是,3D 過(guò)濾器可以沿著所有 3 個(gè)方向移動(dòng)(高、寬以及圖像的通道)。每個(gè)位置經(jīng)過(guò)元素級(jí)別的乘法和算法都得出一個(gè)數(shù)值。由于過(guò)濾器滑動(dòng)通過(guò) 3D 空間,輸出的數(shù)值同樣也以 3D 空間的形式呈現(xiàn),最終輸出一個(gè) 3D 數(shù)據(jù)。
在 3D 卷積中,過(guò)濾器的深度要比輸入層的深度更小(卷積核大小<通道大?。?,結(jié)果是,3D 過(guò)濾器可以沿著所有 3 個(gè)方向移動(dòng)(高、寬以及圖像的通道)。每個(gè)位置經(jīng)過(guò)元素級(jí)別的乘法和算法都得出一個(gè)數(shù)值。由于過(guò)濾器滑動(dòng)通過(guò) 3D 空間,輸出的數(shù)值同樣也以 3D 空間的形式呈現(xiàn),最終輸出一個(gè) 3D 數(shù)據(jù)。
和對(duì) 2D 區(qū)域中目標(biāo)的空間關(guān)系進(jìn)行解碼的 2D 卷積相似,3D 卷積也可以描述 3D 空間中目標(biāo)的空間關(guān)系。對(duì)于一些應(yīng)用來(lái)說(shuō),這種 3D 關(guān)系很重要,例如在 CT 和 MRI 等生物醫(yī)學(xué)圖像的 3D 分割/重建中,這些圖像的目標(biāo)如血管都是蜿蜒分布在 3D 空間中的。
由于我們?cè)谇耙粋€(gè)部分——3D 卷積中探討了深度級(jí)別的操作,接下來(lái)讓我們了解另一個(gè)有趣的操作,1 x 1 卷積。
你或許想知道為什么這個(gè)卷積是有幫助作用的。我們剛剛是否讓輸入層中的每個(gè)數(shù)值都乘以了一個(gè)數(shù)值?是,也不是。對(duì)于僅有 1 個(gè)通道的層來(lái)說(shuō),這項(xiàng)操作不重要。在上面的示例中,我們讓每一個(gè)組成部分都乘以了一個(gè)數(shù)值。
如果輸入層有多個(gè)通道,那事情就變得非常有趣了。下圖闡述了 1 x 1 卷積在一個(gè)維度為 H x W x D 的輸入層上的操作方式。經(jīng)過(guò)大小為 1 x 1 x D 的過(guò)濾器的 1 x 1 卷積,輸出通道的維度為 H x W x 1。如果我們執(zhí)行 N 次這樣的 1 x 1 卷積,然后將這些結(jié)果結(jié)合起來(lái),我們能得到一個(gè)維度為 H x W x N 的輸出層。
過(guò)濾器大小為 1 x 1 x D 的 1 x 1 卷積
1 x 1 卷積最初是在 Network-in-network 的論文(論文閱讀地址:https://arxiv.org/abs/1312.4400)中被提出的,之后在谷歌的 Inception 論文(論文閱讀地址:https://arxiv.org/abs/1409.4842)中被大量使用。1 x 1 卷積具有如下幾個(gè)優(yōu)勢(shì):
減少維度以實(shí)現(xiàn)更有效率的計(jì)算;
進(jìn)行更有效率的低維度嵌入,或者對(duì)特征進(jìn)行池化;
卷積以后反復(fù)應(yīng)用非線性特征。
前兩個(gè)優(yōu)勢(shì)我們可以從上面的圖像中觀察到。執(zhí)行 1 x 1 卷積后,我們明顯減少了維度的深度級(jí)別。假設(shè)原始輸入有 200 個(gè)通道,1 x 1 卷積會(huì)將這些通道(特征)嵌入到一個(gè)單通道中。第三個(gè)優(yōu)勢(shì)在 1 x 1 卷積執(zhí)行后才顯現(xiàn)出來(lái),它會(huì)將線性整流函數(shù)(ReLU)等非線性激活函數(shù)添加進(jìn)模型中。非線性特征讓網(wǎng)絡(luò)學(xué)習(xí)更復(fù)雜的函數(shù)。
谷歌的 Inception 論文中也對(duì)這些優(yōu)勢(shì)進(jìn)行了描述:
「上面這個(gè)模塊(至少在這個(gè)樸素的形式中)的一個(gè)大問(wèn)題是,即便是數(shù)量適度的 5 x 5 卷積,在有大量過(guò)濾器的卷積層之上的計(jì)算也會(huì)過(guò)于昂貴。
這就給提出的框架帶來(lái)了第二個(gè)思路:明智地減少維度并進(jìn)行投影,不然就會(huì)過(guò)度增加對(duì)于計(jì)算的要求。這是基于成功實(shí)現(xiàn)嵌入上的:即便是低維度的嵌入也可以容納大量關(guān)于相對(duì)較大的圖像塊的信息... 也就是說(shuō),在執(zhí)行計(jì)算昂貴的 3 x 3 卷積和 5 x 5 卷積前,往往會(huì)使用 1 x 1 卷積來(lái)減少計(jì)算量。此外,它們也可以利用調(diào)整后的線性激活函數(shù)來(lái)實(shí)現(xiàn)雙重用途。」
針對(duì) 1 x 1 卷積,Yann LeCun 提出了一個(gè)非常有趣的角度:「在卷積網(wǎng)絡(luò)中,不存在像「全連接層」這樣的東西,而只有含有一些 1x1 卷積核和 1 個(gè)全連接表的卷積層」
我們現(xiàn)在知道了如何處理卷積的深度。接下來(lái)討論一下怎樣處理在其他兩個(gè)方向(高&寬)中的卷積,以及重要的卷積算法(onvolution arithmetic)。
這里有一些需要了解的名詞:
卷積核大?。↘ernel size):卷積核在前一部分已經(jīng)討論過(guò)了。卷積核大小確定卷積的視野。
卷積步長(zhǎng)(Stride):它確定的是卷積核滑動(dòng)通過(guò)圖像的步長(zhǎng)。步長(zhǎng)為 1 表示卷積核一個(gè)像素一個(gè)像素地滑動(dòng)通過(guò)圖像;步長(zhǎng)為 2 則表示卷積核在圖像上每滑動(dòng)一次就移動(dòng)了 2 個(gè)像素(即跳過(guò) 1 個(gè)像素)。對(duì)于下面這個(gè)案例中的圖像,我們采用大于或等于 2 的步長(zhǎng)。
填充(Padding):填充定義如何處理圖像的邊界。如果有必要的話,可以通過(guò)將輸入邊界周?chē)奶畛湓O(shè)置為 0,這樣的話,經(jīng)過(guò)填充后的卷積(Tensorflow 中的「相同」填充)就可以保持空間輸出維度與輸入圖像的維度一樣。另一方面,如果不在輸入邊界周?chē)砑?0 填充,未填充的卷積(Tensorflow 中的「有效」填充)僅對(duì)輸入圖像的像素執(zhí)行卷積,輸出大小也會(huì)小于輸入大小。
下圖表示使用卷積核大小為 3、步長(zhǎng)為 1;填充為 1 的 2D 卷積:
這里有一篇不錯(cuò)的文章(A guide to convolution arithmetic for deep learning,https://arxiv.org/abs/1603.07285)詳細(xì)地描述了算法,大家可前往閱讀。這篇文章對(duì)其進(jìn)行了詳細(xì)介紹,并針對(duì)不同的卷積核大小、卷積步長(zhǎng)以及填充分別進(jìn)行了案例分析。這里我僅僅概括出了最常用的結(jié)果:
對(duì)于一個(gè)大小為 i、卷積核大小為 k、填充為 p 以及卷積步長(zhǎng)為 s 的輸入圖像,經(jīng)過(guò)卷積的輸出圖像的大小為 o:
對(duì)于許多應(yīng)用以及在許多網(wǎng)絡(luò)架構(gòu)中,我們通常需要朝與標(biāo)準(zhǔn)卷積相反的方向做轉(zhuǎn)換,例如,當(dāng)我們想要執(zhí)行上采樣(up-sampling)時(shí)。這些案例其中就包括生成高分辨率圖像以及在自動(dòng)編碼器或語(yǔ)義分割中將低維度特征映射映射到高維度空間中。(在隨后的案例中,語(yǔ)義分割首先在編碼器中提取特征映射,然后在解碼器中還原原始圖像的大小從而能夠在原始圖像中對(duì)每一個(gè)像素進(jìn)行分類(lèi)。)
傳統(tǒng)上,研究者可以通過(guò)應(yīng)用插值(interpolation)方案或者手動(dòng)創(chuàng)建規(guī)則來(lái)實(shí)現(xiàn)上采樣。神經(jīng)網(wǎng)絡(luò)等現(xiàn)代架構(gòu)則反過(guò)來(lái)趨向于讓網(wǎng)絡(luò)自己自動(dòng)學(xué)習(xí)合適的轉(zhuǎn)換,而不需要人類(lèi)的干預(yù)。我們可以使用轉(zhuǎn)置卷積來(lái)實(shí)現(xiàn)這一點(diǎn)。
在書(shū)面表達(dá)上,轉(zhuǎn)置卷積也稱(chēng)作反卷積(deconvolution),或小數(shù)步長(zhǎng)的卷積(fractionally strided convolution)。不過(guò)值得一提的是,將其稱(chēng)作「反卷積」并不是那么合適,因?yàn)檗D(zhuǎn)置卷積并不完全是信號(hào)/圖像處理中所定義的反卷積。從技術(shù)上來(lái)說(shuō),信號(hào)處理中的反卷積是卷積的逆向操作,跟這里所說(shuō)的轉(zhuǎn)置卷積不一樣。正因?yàn)榇?,一些論文作者?qiáng)烈反對(duì)將轉(zhuǎn)置卷積稱(chēng)作反卷積,而大眾要這樣稱(chēng)呼主要是為了簡(jiǎn)單起見(jiàn)。隨后,我們會(huì)探討為什么將這種操作稱(chēng)作轉(zhuǎn)置卷積才是自然且更合適的。
我們可以直接使用卷積來(lái)實(shí)現(xiàn)轉(zhuǎn)置卷積。例如在下圖的案例中,我們 2 x 2 的輸入上做轉(zhuǎn)置卷積:其卷積核為 3 x 3,卷積步長(zhǎng)為 1,填充為 2 x 2 的空格。上采樣的輸出大小為 4 x 4。
將 2 x 2 輸入上采樣為 4 x 4 輸出,圖片源自: https://github.com/vdumoulin/conv_arithmetic
非常有趣的是,研究者可以通過(guò)應(yīng)用花式填充和步長(zhǎng),將相同的 2 x 2 輸入圖像映射出不同的圖像大小。下圖中,在同一個(gè)卷積核為 3 x 3,卷積步長(zhǎng)為 1,填充為 2 x 2 空格的 2 x 2 的輸入(輸入之間插入了一個(gè)空格)上做轉(zhuǎn)置卷積,得出的輸出大小為 5 x 5。
將 2 x 2 輸入上采樣為 5 x 5 輸出,圖片源自: https://github.com/vdumoulin/conv_arithmetic
通過(guò)觀察上述案例中的轉(zhuǎn)置卷積,我們可以初步建立一些認(rèn)知。但是要想較好地掌握它的應(yīng)用,在電腦上看看它怎樣通過(guò)矩陣乘法來(lái)實(shí)現(xiàn)會(huì)比較有用。從中,我們還可以了解到為什么「轉(zhuǎn)置卷積」這個(gè)名字更合適。
在卷積中,我們?cè)O(shè)定卷積核為 C,輸入圖像為 Large,卷積輸出的圖像為 Small。在做卷積(矩陣乘法)后,我們將大圖像下采樣(down-sample)為小的輸出圖像。矩陣乘法中的卷積實(shí)現(xiàn)遵循 C x Large = Small。
下面案例顯示了這項(xiàng)操作如何實(shí)現(xiàn)。它將輸入也壓平為 16 x 1 矩陣,之后將卷積核轉(zhuǎn)換為一個(gè)稀疏矩陣 (4 x 16),接著在稀疏矩陣和壓平的輸入間執(zhí)行矩陣乘法運(yùn)算,最終得出的矩陣(4 x 1)轉(zhuǎn)換回 2 x 2 的輸出。
卷積的矩陣乘法:從大小 4 x 4 為 Large 輸入圖像到大小為 2 x 2 的 Small 輸出圖像
現(xiàn)在,如下圖所示,如果我們對(duì)等式兩邊的矩陣 CT 進(jìn)行多次轉(zhuǎn)置,并利用一個(gè)矩陣和其轉(zhuǎn)置矩陣相乘得出一個(gè)單元矩陣的屬性,我們可以得出下面的運(yùn)算公式:CT x Small = Large。
卷積的矩陣乘法:從大小 2x 2 為 Large 輸入圖像到大小為 4 x 4 的 Small 輸出圖像
正如你在這里看到的,轉(zhuǎn)置卷積執(zhí)行的是從小圖像到大圖像的上采樣。這也是我們所要實(shí)現(xiàn)的。而現(xiàn)在,你也可以了解到「轉(zhuǎn)置卷積」這個(gè)名字的由來(lái)。
轉(zhuǎn)置卷積的通用算法可以在《深度學(xué)習(xí)的卷積算法指南》「A guide to convolution arithmetic for deep learning」這篇文章的「Relationship 13」和「Relationship 14」章節(jié)中找到。
6.1 棋盤(pán)效應(yīng)(Checkerboard artifacts)
所謂的「棋盤(pán)效應(yīng)」是研究人員在使用轉(zhuǎn)置卷積時(shí)可以觀察到的一種令人不快的現(xiàn)象(奇怪的棋盤(pán)格狀偽影)。
「棋盤(pán)效應(yīng)」的一些案例。圖片源自論文「Deconvolution and Checkerboard Artifacts」,https://distill.pub/2016/deconv-checkerboard/
《反卷積和棋盤(pán)效應(yīng)》(Deconvolution and Checkerboard Artifacts,https://distill.pub/2016/deconv-checkerboard)對(duì)于這一現(xiàn)象有一個(gè)非常好的闡述。大家可以前往閱讀這篇文章了解詳細(xì)內(nèi)容。這里我僅僅概括出關(guān)鍵點(diǎn)。
造成棋盤(pán)效應(yīng)的原因是轉(zhuǎn)置卷積的「不均勻重疊」(uneven overlap)。這種重疊會(huì)造成圖像中某個(gè)部位的顏色比其他部位更深。
在下圖中,頂部這層是輸入層,底部這層則是操作轉(zhuǎn)置卷積后的輸出層。在轉(zhuǎn)置卷積過(guò)程中,小的這層映射到大的那層。
在案例(a)中,其卷積步長(zhǎng)為 1,過(guò)濾器大小為 2。正紅線所標(biāo)出的,輸入圖像上的第一個(gè)像素映射為輸出圖像上的第一個(gè)和第二個(gè)像素。綠線標(biāo)出的則是輸入圖像上的第二個(gè)像素映射為輸出圖像上的第二個(gè)和第三個(gè)像素。這樣的話,輸出圖像上的第二個(gè)像素就收到了輸入圖像上的第一個(gè)和第二個(gè)像素的雙重信息,而整個(gè)卷積過(guò)程中,輸出圖像中間部分的像素都從輸入圖像中接收到了同樣多的信息,這樣就導(dǎo)致了卷積核重疊的區(qū)域。而在案例(b)中,當(dāng)過(guò)濾器的大小增加到 3 時(shí),這個(gè)接收到最多信息的中間部分縮小了。但是這樣的話問(wèn)題不大,因?yàn)橹丿B部分依舊是均勻的。在輸出圖像中間部分的像素從輸入圖像中接收到同樣多的信息。
圖片源自并修改于論文「Deconvolution and Checkerboard Artifacts」,https://distill.pub/2016/deconv-checkerboard/
現(xiàn)在針對(duì)下面的案例,我們將卷積步長(zhǎng)改為 2。在案例(a)中,過(guò)濾器的大小為 2,輸出圖像上的所有像素從輸入圖像中接收到同樣多的信息,它們都從輸入圖像中接收到一個(gè)像素的信息,這里就不存在轉(zhuǎn)置卷帶來(lái)的重疊區(qū)域。
圖片源自并修改于論文「Deconvolution and Checkerboard Artifacts」,https://distill.pub/2016/deconv-checkerboard/
而在案例(b)中,當(dāng)我們將過(guò)濾器大小增至 4 時(shí),均勻的重疊區(qū)域縮小了,但是研究者依舊可以將輸出圖像的中間部分用作有效的輸出,其中每個(gè)像素從輸入圖像中接收到的信息是同樣多的。
然而,在案例(c)和(d)中,當(dāng)過(guò)濾器大小變成 3 或 5 時(shí),情況就變得非常有趣了。在這兩個(gè)案例中,輸出圖像上的每個(gè)像素與其毗鄰的像素所接收到的信息量都不相同。研究者在輸出圖像上無(wú)法找到一個(gè)連續(xù)并均勻的重疊區(qū)域。
當(dāng)過(guò)濾器大小無(wú)法被卷積步長(zhǎng)整除時(shí),轉(zhuǎn)置卷積就會(huì)出現(xiàn)「不均勻重疊」。這種「不均勻重疊」會(huì)造成圖像中某個(gè)部位的顏色比其他部位更深,因而會(huì)帶來(lái)「棋盤(pán)效應(yīng)」。實(shí)際上,不均勻重疊區(qū)域會(huì)在二維上更加極端。因?yàn)槎S上的兩個(gè)模式會(huì)相乘,因而最終的不均勻性是原來(lái)的平方。
在應(yīng)用轉(zhuǎn)置卷積時(shí),可以做兩件事情來(lái)減輕這種效應(yīng)。第一,確認(rèn)使用的過(guò)濾器的大小是能夠被卷積步長(zhǎng)整除的,從而來(lái)避免重疊問(wèn)題。第二,可以采用卷積步長(zhǎng)為 1 的轉(zhuǎn)置卷積,來(lái)減輕「棋盤(pán)效應(yīng)」。然而,正如在最近許多模型中所看到的,這種效益依舊可能會(huì)顯露出來(lái)。
這篇論文進(jìn)一步提出了一個(gè)更好的上采樣方法:首先調(diào)整圖像大?。ㄊ褂米罱徲騼?nèi)插法(Nearest Neighbor interpolation)和雙向性?xún)?nèi)插法(bilinear interpolation)),然后制作一個(gè)卷積層。通過(guò)這樣做,論文作者成功避免了這一「棋盤(pán)效應(yīng)」。大家或許也想要在自己的應(yīng)用中嘗試一下這個(gè)方法吧。
(上篇)
via:https://towardsdatascience.com/a-comprehensive-introduction-to-different-types-of-convolutions-in-deep-learning-669281e58215 雷鋒網(wǎng)
雷峰網(wǎng)原創(chuàng)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見(jiàn)轉(zhuǎn)載須知。