制全解:卷積核、池化與參數(shù)共享)
做視覺(jué)方向的項(xiàng)目久了你會(huì)發(fā)現(xiàn)一個(gè)很普遍的現(xiàn)象很多人對(duì)CNN“會(huì)用但說(shuō)不清”比如知道卷積核在提特征卻說(shuō)不明白為什么 3×3 小核反復(fù)堆疊反而好過(guò)大核知道有池化層卻不清楚它到底在解決什么問(wèn)題知道參數(shù)共享是CNN省參數(shù)的“法寶”但真要算一筆賬又不知道省在哪里。這篇文章就從這三個(gè)最核心的機(jī)制講透順帶聊聊我在實(shí)際調(diào)參和調(diào)試模型時(shí)踩過(guò)的坑。不管你是剛接觸深度學(xué)習(xí)的初學(xué)者還是已經(jīng)跑通多個(gè)項(xiàng)目但想補(bǔ)一補(bǔ)底層原理的工程師這篇文章都適合你。內(nèi)容圍繞卷積核、池化和參數(shù)共享展開(kāi)我會(huì)結(jié)合具體數(shù)值例子、輸出尺寸計(jì)算和工程實(shí)操思路來(lái)講盡量讓每個(gè)概念落到能直接動(dòng)手驗(yàn)證的層面。1. 從一個(gè)實(shí)際問(wèn)題看懂CNN的設(shè)計(jì)動(dòng)機(jī)1.1 全連接網(wǎng)絡(luò)為什么在圖像上行不通先看一個(gè)基礎(chǔ)問(wèn)題如果拿全連接網(wǎng)絡(luò)直接處理圖像會(huì)發(fā)生什么假設(shè)輸入是一張 224×224 的彩色圖片通道數(shù)是3展平后就是 224×224×3150528 個(gè)像素值。如果第一層隱藏層有256個(gè)神經(jīng)元那這一層光權(quán)重就有 150528×256約3850萬(wàn)個(gè)參數(shù)。對(duì)于一張圖片就是千萬(wàn)級(jí)參數(shù)幾十個(gè)類(lèi)別、上萬(wàn)張圖片的數(shù)據(jù)集參數(shù)量立刻會(huì)膨脹到難以收斂的程度。更麻煩的是全連接層對(duì)輸入位置極其敏感圖片里一個(gè)物體從左上角移到右下角所有的像素索引都變了需要重新學(xué)習(xí)一套權(quán)重這顯然不是人類(lèi)視覺(jué)系統(tǒng)理解圖像的方式。人類(lèi)看圖首先看到的是局部紋理、邊緣和顏色塊而不是一串扁平的像素序號(hào)。CNN的整套設(shè)計(jì)本質(zhì)上就是在還原這種“局部特征提取 逐層抽象”的視覺(jué)認(rèn)知方式。1.2 CNN的三個(gè)核心思想都被圖像特性逼出來(lái)了圖像數(shù)據(jù)有兩個(gè)關(guān)鍵特性一是像素之間有很強(qiáng)的空間局部性一個(gè)特征往往由相鄰幾個(gè)像素共同決定二是同一個(gè)特征在全圖中可能反復(fù)出現(xiàn)比如“橫線”這個(gè)模式在圖片的某個(gè)角落出現(xiàn)也可能在另一個(gè)角落出現(xiàn)。卷積核解決了局部特征提取的問(wèn)題它只關(guān)注一小塊鄰域而不是整張圖。參數(shù)共享解決了重復(fù)模式的問(wèn)題同一套卷積核參數(shù)滑過(guò)全圖在哪個(gè)位置提取到類(lèi)似模式都用同一組權(quán)重。池化解決的則是計(jì)算量和位置敏感性的矛盾它通過(guò)下采樣降低特征圖尺寸同時(shí)減輕微小位移帶來(lái)的影響。這三件事不是孤立的它們共同構(gòu)成了CNN“用更少參數(shù)、更高效地學(xué)習(xí)空間特征”的完整邏輯。2. 卷積核那個(gè)在圖上滑動(dòng)的特征提取器2.1 卷積核到底計(jì)算了什么卷積核本質(zhì)上是一組小尺寸的權(quán)重矩陣比如 3×3 或 5×5。在圖像處理領(lǐng)域很多人第一次接觸這個(gè)概念是在圖像濾波時(shí)。經(jīng)典的Sobel算子就是一組 3×3 卷積核專(zhuān)門(mén)用來(lái)檢測(cè)垂直邊緣它的一個(gè)形態(tài)是[ 1, 0, -1 ] [ 1, 0, -1 ] [ 1, 0, -1 ]這個(gè)核在圖像上滑動(dòng)每次覆蓋一個(gè) 3×3 的區(qū)域執(zhí)行的是“逐元素相乘再求和”的操作。如果覆蓋的區(qū)域在左邊是亮、右邊是暗也就是存在垂直方向的灰度差異輸出值就會(huì)比較大如果區(qū)域是均勻的乘加結(jié)果接近0。所以卷積層的輸出特征圖里值大的位置往往就對(duì)應(yīng)原圖中某種特定模式的出現(xiàn)位置。我在入門(mén)時(shí)犯過(guò)的一個(gè)誤區(qū)是總把卷積核當(dāng)成“做數(shù)學(xué)變換的通用模板”去套公式理解結(jié)果越套越暈。實(shí)際上在監(jiān)督訓(xùn)練里卷積核里的每個(gè)數(shù)值不是人為設(shè)定的而是通過(guò)反向傳播自動(dòng)學(xué)習(xí)出來(lái)的。你可以把訓(xùn)練過(guò)程理解成“在解空間里搜索出一組最好的參數(shù)”讓這組參數(shù)在訓(xùn)練集上能提取出最有區(qū)分度的特征。預(yù)定義好的邊緣檢測(cè)算子給了我們一個(gè)直觀的參照但CNN學(xué)習(xí)到的核往往比任手工設(shè)計(jì)的濾波器要復(fù)雜和抽象得多。2.2 核大小、步長(zhǎng)和填充這三個(gè)參數(shù)有什么講究卷積層的參數(shù)除了核本身的值還有核大小kernel size、步長(zhǎng)stride和填充padding它們共同決定了輸出特征圖的尺寸和位置敏感程度。核大小最常見(jiàn)的是 3×3因?yàn)閮蓚€(gè)連續(xù)的 3×3 卷積疊加感受野等價(jià)于一個(gè) 5×5 卷積但參數(shù)更少非線性表達(dá)能力更強(qiáng)。5×5 的核更像是早期網(wǎng)絡(luò)里的常用選擇比如第一代CNN結(jié)構(gòu)里常見(jiàn)的就是 5×5。1×1 的核則是另一類(lèi)存在它不聚合空間鄰域信息但可以對(duì)通道維度做線性組合常用來(lái)降維或增加非線性是很多輕量網(wǎng)絡(luò)的標(biāo)配。步長(zhǎng)影響輸出尺寸和計(jì)算量。步長(zhǎng)為 1 時(shí)輸出尺寸變化不大適合需要精確保留空間信息的任務(wù)步長(zhǎng)為 2 時(shí)特征圖縮小一半相當(dāng)于做了一次下采樣。填充解決了邊界信息丟失的問(wèn)題如果沒(méi)有填充最邊緣像素參與卷積的次數(shù)只有內(nèi)部像素的一半信息利用不充分在輸入周?chē)a(bǔ)一圈0能讓核完整覆蓋邊緣。值得注意的是補(bǔ)0填充不是因?yàn)檫吘売?值信息而是為了讓卷積在邊界處依然可以執(zhí)行計(jì)算避免有效區(qū)域被反復(fù)卷積后迅速縮沒(méi)。2.3 輸出尺寸怎么算附一個(gè)可驗(yàn)證的例子輸出特征圖尺寸有一個(gè)通用公式輸出尺寸 floor((輸入尺寸 2×填充 - 核大小) / 步長(zhǎng)) 1其中 floor 表示向下取整。我用一個(gè)具體例子驗(yàn)證一下。假如輸入是一張 5×5 的單通道特征圖[ 1, 0, 2, 1, 0 ] [ 0, 1, 1, 0, 2 ] [ 2, 1, 0, 1, 1 ] [ 1, 0, 2, 0, 1 ] [ 0, 2, 1, 2, 0 ]用一個(gè) 3×3、不填充、步長(zhǎng)為1的卷積核來(lái)掃一遍。此時(shí)輸出尺寸為 (5 0 - 3) / 1 1 3也就是3×3。我們?nèi)『藶榇怪边吘墮z測(cè)核看左上角輸出是怎么來(lái)的核覆蓋輸入左上角 3×3 區(qū)域后逐元素相乘1×1 0×0 2×(-1) -1 0×1 1×0 1×(-1) -1 2×1 1×0 0×(-1) 2三者相加偏置若為0則第一個(gè)輸出位置的值為0。把核滑到下一個(gè)位置計(jì)算過(guò)程完全一樣。這個(gè)手算過(guò)程很有價(jià)值它有助于你理解卷積的輸出不是某個(gè)單一像素的響應(yīng)而是卷積核與局部區(qū)域的匹配程度。實(shí)際工程里如果發(fā)現(xiàn)輸出尺寸和自己推算的結(jié)果對(duì)不上往往就是填充或步長(zhǎng)設(shè)置出了問(wèn)題手動(dòng)推一遍最快。3. 參數(shù)共享用一套參數(shù)吃遍整張圖3.1 和全連接層算一筆賬參數(shù)差距有多大參數(shù)共享是CNN相對(duì)全連接網(wǎng)絡(luò)最直接的效率優(yōu)勢(shì)。它背后的意思是同一個(gè)卷積核在全圖所有位置使用完全相同的一套權(quán)重。這和全連接層形成鮮明對(duì)比全連接層里每個(gè)輸出神經(jīng)元都連接到所有輸入神經(jīng)元每個(gè)連接都有自己的權(quán)重訓(xùn)練時(shí)需要獨(dú)立更新。我們做一次具體對(duì)比。假設(shè)輸入是一張 100×100 的RGB圖像。如果采用 CNN第一層用 64 個(gè) 3×3 卷積核每個(gè)核有 3×3×3 個(gè)權(quán)重3表示輸入通道再加1個(gè)偏置也就是 28 個(gè)可訓(xùn)練參數(shù)64 個(gè)核總共才 1792 個(gè)參數(shù)。相反如果用全連接網(wǎng)絡(luò)處理同樣輸入輸入展平為 30000 個(gè)值即使隱藏層只放 6000 個(gè)神經(jīng)元這一層的權(quán)重?cái)?shù)量也是 30000×6000高達(dá) 1.8 億。就算算力再?gòu)?qiáng)這種模型在小數(shù)據(jù)集上也很難訓(xùn)練起來(lái)很容易欠擬合或者過(guò)擬合。參數(shù)共享之所以行得通是因?yàn)橐曈X(jué)特征往往具有平移不變性。比如檢測(cè)貓耳朵邊緣的“彎折角”模式這種模式在圖片左上角出現(xiàn)了一組邊換個(gè)位置出現(xiàn)另一組邊其局部紋理結(jié)構(gòu)是相似的完全可以用同一組卷積核來(lái)響應(yīng)它。如果給每個(gè)像素位置都單獨(dú)配一套權(quán)重模型會(huì)失去泛化能力還會(huì)因?yàn)槟硞€(gè)位置樣本太少而學(xué)不充分。3.2 參數(shù)共享和卷積核數(shù)量之間的配合共享的前提是每個(gè)卷積核本身要足夠通用。卷積核數(shù)量太少表達(dá)能力不足數(shù)量太多計(jì)算量和顯存占用都會(huì)漲。典型情況是第一個(gè)卷積層只放 16 到 64 個(gè)核特征圖數(shù)量逐層翻倍。為什么不是第一層就用 256 個(gè)核因?yàn)闇\層特征通常是一些簡(jiǎn)單的邊緣和紋理沒(méi)有那么多樣而深層特征需要捕獲更復(fù)雜的語(yǔ)義組合才需要更多核。參數(shù)共享讓這種“淺層少核、深層多核”的結(jié)構(gòu)在參數(shù)量上依然保持可控。我還要說(shuō)一個(gè)容易被忽略的點(diǎn)權(quán)重共享只在同一個(gè)卷積核內(nèi)部成立。不同卷積核之間是完全獨(dú)立的。當(dāng)你設(shè)定第一層有 64 個(gè)核實(shí)際上是構(gòu)建了 64 種不同的局部特征檢測(cè)器每種檢測(cè)器以共享的方式檢查全圖。所以“共享”并不是讓所有特征用同一組參數(shù)而是每一種特征模式都對(duì)應(yīng)一組參數(shù)、在全圖復(fù)用。理解這一點(diǎn)再看通道數(shù)的設(shè)計(jì)就會(huì)清楚很多。3.3 1×1卷積和組卷積是對(duì)共享機(jī)制的補(bǔ)充變化1×1卷積沒(méi)有空間鄰域聚合但仍然在通道維度上使用一組權(quán)值去組合所有通道的信息。它和全連接層不一樣全連接層要求輸入是一維向量1×1卷積則可以保留空間結(jié)構(gòu)對(duì)每個(gè)像素位置獨(dú)立做一次通道間的線性加權(quán)。組卷積則是把輸入通道分幾組每組獨(dú)立做卷積組間不共享參數(shù)。這樣做的目的主要是降低計(jì)算量和減少過(guò)擬合。實(shí)際使用中組卷積因?yàn)楦淖兞藚?shù)的耦合方式往往需要對(duì)通道數(shù)進(jìn)行合理規(guī)劃比如保證每組通道數(shù)能整除。這些都是參數(shù)共享思想上衍生出來(lái)的變體理解了最基礎(chǔ)的共享邏輯后面學(xué)這些復(fù)雜結(jié)構(gòu)會(huì)輕松很多。4. 池化把分辨率換來(lái)穩(wěn)健性4.1 最大池化到底在做什么為什么常用池化層做的事情很簡(jiǎn)單在一個(gè)小窗口內(nèi)做聚合統(tǒng)計(jì)。最常用的是最大池化比如 2×2、步長(zhǎng)為2的最大池化把特征圖劃分成互不重疊的 2×2 小塊每個(gè)小塊只保留數(shù)值最大的那個(gè)元素。這樣做的直觀理由是卷積后特征圖里的值表示“某種模式在該位置出現(xiàn)的強(qiáng)度”值越大代表響應(yīng)越強(qiáng)最大池化自然就把最強(qiáng)響應(yīng)保留了下來(lái)。為什么最大池化能帶來(lái)一定的平移不變性想象一個(gè)物體在圖片里移動(dòng)了一兩個(gè)像素經(jīng)過(guò)卷積后最大響應(yīng)位置可能跟著移動(dòng)了一點(diǎn)但只要移動(dòng)沒(méi)有超出池化窗口的范圍池化結(jié)果就可能不變。這在分類(lèi)任務(wù)里特別有用我們關(guān)心的是“這個(gè)物體存不存在”而不是“它的邊緣具體落在哪個(gè)像素”。當(dāng)然在像素級(jí)分割任務(wù)里這種信息丟失需要被謹(jǐn)慎對(duì)待所以很多分割網(wǎng)絡(luò)會(huì)避免在最后一層之前使用激進(jìn)的下采樣。4.2 平均池化和全局平均池化以及三者的取舍平均池化取窗口內(nèi)所有元素的平均值它對(duì)噪聲更平滑但也容易把強(qiáng)響應(yīng)“稀釋”掉。全局平均池化則把整個(gè)特征圖直接壓縮成一個(gè)值通常放在最后一個(gè)卷積層之后直接取代全連接層。它和全連接層相比最大的優(yōu)勢(shì)是天然完成了降維而且不需要引入大量額外參數(shù)還能讓每個(gè)輸出通道對(duì)應(yīng)一個(gè)類(lèi)別級(jí)別的語(yǔ)義可解釋性更強(qiáng)。池化類(lèi)型輸出含義優(yōu)點(diǎn)注意點(diǎn)最大池化局部最強(qiáng)響應(yīng)保留顯著特征、抗輕微位移容易丟失弱特征和精確位置平均池化局部平均響應(yīng)平滑、穩(wěn)定、對(duì)噪聲不敏感會(huì)弱化強(qiáng)響應(yīng)全局平均池化整圖單通道均值無(wú)額外參數(shù)、可解釋性強(qiáng)過(guò)早使用會(huì)損失空間信息實(shí)際經(jīng)驗(yàn)里分類(lèi)任務(wù)多用最大池化早期網(wǎng)絡(luò)常見(jiàn)到后期注意力機(jī)制普及后全局平均池化更受青睞因?yàn)樗芎腿B接層比較自然地銜接分割、檢測(cè)這類(lèi)需要空間細(xì)節(jié)的任務(wù)則盡量少用池化或者直接用步長(zhǎng)卷積代替。4.3 池化之外步長(zhǎng)卷積能不能完全替代池化池化不是唯一的下采樣手段。既然卷積本身有步長(zhǎng)參數(shù)直接用步長(zhǎng)為2的卷積也可以讓特征圖尺寸減半而且下采樣的同時(shí)還能學(xué)習(xí)特征。這在近幾年的網(wǎng)絡(luò)設(shè)計(jì)中很常見(jiàn)尤其是生成模型和一些追求結(jié)構(gòu)統(tǒng)一的設(shè)計(jì)里用帶步長(zhǎng)的卷積代替池化可以減少信息丟失同時(shí)增加非線性。但步長(zhǎng)卷積并不是池化的完美替代。最大池化帶來(lái)的平移不變性是步長(zhǎng)卷積不具備的而步長(zhǎng)卷積的參數(shù)量更大。在實(shí)際模型里你可以根據(jù)自己的任務(wù)權(quán)衡如果目標(biāo)是分類(lèi)且數(shù)據(jù)增強(qiáng)做得不夠保留池化層會(huì)更穩(wěn)定如果目標(biāo)是像素級(jí)的精確輸出步長(zhǎng)卷積可能更合適。我在處理語(yǔ)義分割模型時(shí)試過(guò)把池化全部改成步長(zhǎng)卷積獲得更好的位置信息保留但同時(shí)也發(fā)現(xiàn)訓(xùn)練收斂變慢需要在損失函數(shù)和學(xué)習(xí)率上做調(diào)整。5. 把層堆起來(lái)輸出尺寸預(yù)測(cè)與結(jié)構(gòu)設(shè)計(jì)5.1 一個(gè)小網(wǎng)絡(luò)示例從輸入到輸出逐步推算理解了單個(gè)機(jī)制接下來(lái)就是組合問(wèn)題。下面用一個(gè)簡(jiǎn)化例子走一遍。假設(shè)輸入是 32×32 灰度圖也就是單通道 32×32 矩陣。第一層卷積核 3×3步長(zhǎng)1填充1核數(shù)32。輸出尺寸 (32 2×1 - 3) / 1 1 32特征圖尺寸不變化通道數(shù)從1變成32。第二層2×2最大池化步長(zhǎng)2。輸出尺寸變成 32/2 16通道數(shù)仍是32。第三層卷積核 3×3步長(zhǎng)1填充1核數(shù)64。輸出尺寸 (16 2×1 - 3) / 1 1 16通道數(shù)變成64。第四層2×2最大池化步長(zhǎng)2。輸出尺寸變成 8通道數(shù)64。第五層再重復(fù)一次卷積和池化卷積后尺寸仍為8通道數(shù)變成128池化后尺寸變成4。此時(shí)如果接一個(gè)全連接分類(lèi)層就需要把特征圖展平。比如當(dāng)前是 4×4×128 2048 個(gè)值再接一個(gè) 128 節(jié)點(diǎn)的全連接層權(quán)重是 2048×128這個(gè)量已經(jīng)不算大。但如果前面沒(méi)有池化到當(dāng)前階段特征圖還是 32×32×128展平成 131072 個(gè)值再接全連接層參數(shù)就會(huì)爆炸。這就是為什么池化層在CNN結(jié)構(gòu)里承擔(dān)著“控制參數(shù)增長(zhǎng)”這個(gè)重要任務(wù)。5.2 設(shè)計(jì)網(wǎng)絡(luò)時(shí)怎么避免尺寸不匹配在實(shí)際用深度學(xué)習(xí)框架搭建網(wǎng)絡(luò)時(shí)尺寸不匹配是很常見(jiàn)的報(bào)錯(cuò)。避免它的辦法是在寫(xiě)代碼前先按公式把每層輸出尺寸畫(huà)出來(lái)。我個(gè)人的習(xí)慣是建一個(gè)小表格從輸入到輸出的每一層都列清楚類(lèi)型、核大小、步長(zhǎng)、填充、輸出尺寸。填完之后檢查最后和全連接層的輸入維度是否一致確認(rèn)無(wú)誤再開(kāi)始寫(xiě)代碼。如果尺寸不匹配最常見(jiàn)的修法有兩種調(diào)整填充使尺寸不變或調(diào)整步長(zhǎng)控制降采樣倍數(shù)。很多分類(lèi)網(wǎng)絡(luò)的“卷積后分辨率不變、池化讓分辨率減半”的模式就是為了讓尺寸計(jì)算變得可預(yù)期。一旦引入非統(tǒng)一步長(zhǎng)或非方形輸入手工計(jì)算就特別容易出錯(cuò)這時(shí)候更要在紙上把公式推一遍。我曾經(jīng)因?yàn)樵谶B續(xù)兩層都設(shè)置了步長(zhǎng)2導(dǎo)致特征圖縮得太快最后全連接層維度對(duì)不上排查了半天才發(fā)現(xiàn)是一個(gè)填充參數(shù)寫(xiě)錯(cuò)了。5.3 調(diào)整下采樣策略時(shí)要關(guān)注感受野的變化深層特征圖上的每個(gè)像素點(diǎn)對(duì)應(yīng)回原圖上的區(qū)域大小叫感受野。池化次數(shù)和卷積核大小直接影響感受野。如果堆了太多池化感受野雖然變大但位置信息丟失更大如果池化次數(shù)太少感受野不夠大模型看不到足夠大的范圍識(shí)別大物體時(shí)特征可能不夠全局。我在做目標(biāo)檢測(cè)時(shí)體會(huì)很深。檢測(cè)既要保空間位置又要有足夠的感受野來(lái)理解物體整體結(jié)構(gòu)。通常的做法是在網(wǎng)絡(luò)的不同階段控制不同的下采樣倍數(shù)最后匯總多層特征。這類(lèi)結(jié)構(gòu)之所以叫“特征金字塔”就是因?yàn)闇\層特征感受野小但位置準(zhǔn)深層特征感受野大但位置粗二者配合才能兼顧性能。這也是為什么現(xiàn)在很多模型不再簡(jiǎn)單堆池化而是讓不同層都有輸出分支。6. 常見(jiàn)問(wèn)題與實(shí)戰(zhàn)排查實(shí)錄6.1 訓(xùn)練不收斂先檢查這三處CNN入門(mén)經(jīng)常遇到loss不降的情況。我的建議是不要一上來(lái)就調(diào)學(xué)習(xí)率先做三件事第一檢查輸入數(shù)據(jù)是否歸一化圖像數(shù)據(jù)如果直接以0到255的整數(shù)送入網(wǎng)絡(luò)卷積輸出的數(shù)值范圍會(huì)很大梯度容易爆炸第二檢查卷積后的激活函數(shù)和初始化方式是否匹配第三用小批量、單輪迭代試跑如果前幾步loss就劇烈震蕩多半是學(xué)習(xí)率太大或數(shù)據(jù)沒(méi)預(yù)處理好。這些問(wèn)題的根源往往都不在CNN的獨(dú)特機(jī)制上但在實(shí)踐中它們和CNN參數(shù)共享帶來(lái)的“參數(shù)更新耦合”疊加后會(huì)表現(xiàn)得更加明顯。同一個(gè)卷積核在全圖共享一旦其中某個(gè)參數(shù)更新出問(wèn)題影響就會(huì)分布到所有位置所以數(shù)值穩(wěn)定性比全連接網(wǎng)絡(luò)更需注意。6.2 池化到底該放哪個(gè)位置深層的直覺(jué)是什么有些人習(xí)慣每個(gè)卷積層后面都加池化有些則只在特征圖過(guò)大時(shí)才加。經(jīng)驗(yàn)來(lái)說(shuō)網(wǎng)絡(luò)淺層特征圖空間尺寸大、通道數(shù)少可以重點(diǎn)承擔(dān)提取細(xì)致紋理的職責(zé)過(guò)早池化會(huì)讓細(xì)小特征如邊緣方向、角點(diǎn)位置過(guò)早丟失。所以一般是在網(wǎng)絡(luò)疊加了兩三個(gè)卷積層后再做一次池化而不是每個(gè)卷積都跟一個(gè)池化。深層網(wǎng)絡(luò)中特征圖尺寸已經(jīng)比較小池化帶來(lái)的信息損失影響更大。比如 4×4 的特征圖再用一次 2×2 池化就只剩下 2×2幾乎把空間信息全部抹掉。如果后面還要接檢測(cè)頭或分割頭這樣做通常是不劃算的。判斷池化位置是否合適的辦法很簡(jiǎn)單把中間特征圖可視化出來(lái)看看你關(guān)心的目標(biāo)信息在哪個(gè)層還清晰可辨再?zèng)Q定在哪個(gè)階段下采樣。6.3 經(jīng)典問(wèn)題速查表問(wèn)題現(xiàn)象可能原因檢查方向loss 不降或震蕩大輸入未歸一化 / 學(xué)習(xí)率過(guò)大檢查數(shù)據(jù)預(yù)處理與lr輸出尺寸與預(yù)期不符填充、步長(zhǎng)或核大小設(shè)置錯(cuò)誤手動(dòng)套用輸出尺寸公式過(guò)擬合嚴(yán)重模型參數(shù)量過(guò)大 / 池化不夠增加池化或正則化訓(xùn)練速度慢卷積核數(shù)過(guò)多 / 輸入分辨率大做通道數(shù)裁剪深層特征空間信息弱池化下采樣次數(shù)太多減少池化層或用步長(zhǎng)卷積這張表是我日常排查時(shí)最常用的一份清單。它不能直接解決所有問(wèn)題但能幫你把“莫名其妙的報(bào)錯(cuò)”轉(zhuǎn)成“可定位的參數(shù)問(wèn)題”大幅減少瞎試的時(shí)間。7. 從看明白到真懂一點(diǎn)私人建議我見(jiàn)過(guò)不少同學(xué)把CNN的組件背得滾瓜爛熟真到改網(wǎng)絡(luò)結(jié)構(gòu)時(shí)還是只敢用現(xiàn)成模型。我認(rèn)為最有效的突破方式不是再找一門(mén)課而是自己手推一遍輸出尺寸、手算一遍參數(shù)共享的參數(shù)量再動(dòng)手寫(xiě)一個(gè)極小的CNN拿個(gè)十張圖片的數(shù)據(jù)集跑通一遍。這個(gè)過(guò)程花不了太多時(shí)間但能讓卷積核、池化和參數(shù)共享在你腦子里從“抽象概念”變成“具體操作”。我自己早期做實(shí)驗(yàn)時(shí)喜歡把某個(gè)小卷積核的權(quán)重視覺(jué)化出來(lái)看你會(huì)直觀感受到訓(xùn)練很多輪之后它變成了什么形狀。有人說(shuō)這些權(quán)重太難解釋我覺(jué)得對(duì)普通工程來(lái)說(shuō)不需要完全解釋每個(gè)值只要知道它確實(shí)在學(xué)習(xí)有用的局部模式就說(shuō)明參數(shù)共享和卷積機(jī)制在按預(yù)期工作。如果有一天你發(fā)現(xiàn)可視化出的核非常雜亂通常是網(wǎng)絡(luò)沒(méi)收斂或數(shù)據(jù)有問(wèn)題那是很好的排查線索。另外一個(gè)小技巧遇到輸出尺寸對(duì)不上的報(bào)錯(cuò)不要急著看文檔先拿支筆把公式算一遍。我靠這個(gè)習(xí)慣省下來(lái)的調(diào)試時(shí)間比用任何調(diào)試工具都多。CNN的精髓不在于組件多復(fù)雜而在于這三板斧——局部連接、權(quán)值共享、空間下采樣——怎么配合著把視覺(jué)問(wèn)題解掉的。把這層關(guān)系理清楚了后面學(xué)ResNet、注意力機(jī)制、Transformer視覺(jué)模型都會(huì)順暢很多。