此分類用於記錄吳恩達深度學習課程的學習筆記。
課程相關信息鏈接如下:
- 原課程視頻鏈接:[雙語字幕]吳恩達深度學習deeplearning.ai
- github課程資料,含課件與筆記:吳恩達深度學習教學資料
- 課程配套練習(中英)與答案:吳恩達深度學習課後習題與答案
本篇為第四課的第一週內容,1.6到1.8的內容。
本週為第四課的第一週內容,這一課所有內容的中心只有一個:計算機視覺。應用在深度學習裏,就是專門用來進行圖學習的模型和技術,是在之前全連接基礎上的“特化”,也是相關專業裏的一個重要研究大類。
這一整節課都存在大量需要反覆理解的內容和機器學習、數學基礎。 因此我會盡可能的補足基礎,用比喻和實例來演示每個部分,從而幫助理解。
本篇的內容關於簡單卷積網絡,是對之前知識的一次簡單整合應用,篇幅較長,但理解上的難度並不大。
1. 多維卷積:通道數
我們在基礎部分裏提到過,一張“亮度表”只能表示灰度圖,而彩色圖像都是是三維表格。
到目前為止,我們一直在用灰度圖來進行演示,也就是 \(M \times N\) 的二維表格。但真實世界的圖片不是二維的,而是三維的:
我們稱之為 RGB 三通道。
對於多通道,我們可以把它想象成一個“分層蛋糕”:
上層是紅色信息(R),
中層是綠色信息(G),
下層是藍色信息(B) 。
每一層都是一張 2D 圖,但三層疊在一起,才構成完整的彩色圖像,就像這樣:
現在繼續按我們之前的符號規範引入通道數:
我們用 \(n_c\) 來表示通道數的多少,現在一幅圖像就要表示為:$$n \times n \times n_c$$下面就展開一下多維卷積的過程。
1.1 卷積核如何應對多通道圖像?
現在,我們輸入的圖像“亮度表”從二維變成了多維,你認為卷積核要怎麼修改才能適應這個變化?
答案很符合直覺:你變成幾維,我也變成幾維就好了。
對彩色圖片進行卷積時,一個卷積核不再是 \(f \times f\),它同樣增加了通道數:
表示它對 R、G、B 三個通道各自有一塊小卷積核。
打個比方:卷積核就像海綿,隨着圖像維度增加,卷積核也不是一層海綿,而是“疊了三層的海綿”,每層負責吸收一層顏色的信息,做對應層的“清潔處理”工作。
就像這樣:
我們繼續,看看在這樣的改變下如何進行卷積操作。
1.2 多維卷積如何進行?
先來看看結果:
你發現,三通道的輸入圖像經過三通道的卷積核,變成了一張單通道圖。
這是一個比較反直覺的部分,為什麼結果不是三通道而是變成了單通道?
我們先介紹一下多維卷積的運算步驟,再從原理上回答這個問題。
卷積步驟如下:
- 對 R 通道卷積核的 R 部分做卷積。
- 對 G 通道卷積核的 G 部分做卷積。
- 對 B 通道卷積核的 B 部分做卷積。
- 把三份結果相加,得到一個單獨的數,這就是輸出特徵圖的一個像素。
再按照課程內容演示一下:
現在,我們從原理上説説:為什麼非要把三層結果相加成一層,而不是讓結果也是三通道?
我們先回到卷積核的基本作用:提取局部特徵。
就像我們之前的邊緣檢測部分,我們用人工設計的一個固定卷積核來提取圖像的豎直邊緣。
應用到這個例子中,首先要明確的一點是:我們只是把一個樣本用三個通道來表示,這並不是三個樣本。
如果我們對三個通道進行豎直邊緣檢測,實際上也只是在檢測一幅圖像的豎直邊緣。當卷積核要在這一幅圖像上判斷“有沒有豎直邊緣”這種特徵時,它必須綜合這三個通道的共同表現,而不是分別給出三個答案。
所以結果自然是一張單通道的特徵圖,表示“這幅圖像這個特徵的強弱”。
再打個比方:
你佩戴紅色、綠色、藍色的濾光鏡,看同一個蘋果,想知道“蘋果輪廓在哪裏”。
這時,你不可能給出三個輪廓,而是把三次看到的輪廓信息綜合,得到唯一一個真正的輪廓。
如果你還比較糾結這個問題,沒關係,我們下面就來看看,什麼情況下,輸出是多通道的。
1.3 多特徵提取
很顯然,如果我們想讓計算機“認識”某些物體,比如貓,就不能像上面一樣,對應一個樣本,只檢測它的豎直邊緣,對於這種低層特徵,我們需要更多內容,比如水平邊緣,傾斜邊緣,光亮程度,紋理變化等等·····
只有這樣,我們才讓一步步拼出貓眼睛,貓耳朵,貓嘴巴,身體等高層特徵,最終讓機器學習到:什麼是貓,對其他東西也是同理。
所以,在卷積中,對一個或者一批次樣本,一次提取多個特徵,才是更合理的做法。
如何實現這一點?
同樣很符合直覺:我用這個卷積核提取豎直邊緣,那我再來一個卷積核提取水平邊緣,再來幾個卷積核提取別的特徵不就好了?
當然,要提前強調的是,在深度學習領域裏,我們不會明確的得知哪個卷積核對應哪個特徵,這些是模型自己學習和更新的,但是,每一個卷積核,一定代表一個不同的角度。
現在,重點來了,每一個卷積核對圖像進行卷積操作就會生成一個特徵圖,那你覺得這些不同的特徵圖會如何組織呢?
答案就是通道數。
來進行演示:
現在,我們就得到了輸出圖像的通道規律:輸出圖像的通道數等於該層卷積核數量。
下一部分,我們就來正式認識一下卷積網絡。
2. 卷積層的正向傳播過程
還記得在全連接網絡中,數據經過一個全連接層的傳播過程是什麼樣的嗎?
這是兩個最重要的公式:
如果你有些忘了它們是幹什麼的了,它們的總結在這裏:深度神經網絡的關鍵概念
而現在,對於一層中應用卷積操作而不是線性組合的層級,我們稱為卷積層。
這裏要強調一下,卷積層可以是隱藏層,全連接層也可以是隱藏層。前者是説明層級的內容,後者是説明層級的位置。
現在就繼續用上面的例子,來看看卷積層是如何進行正向傳播的,先不擺公式,符號的引入讓正式的卷積傳播公式相當的亂,擺出來反而阻礙理解,我們先用全連接層的公式來類別一下。
這一步的類比很容易理解,大致看來,我們就算把線性組合的內容換成了卷積操作。
如果還用全連接網絡的內容來類比,我們還可以説,一層中有幾個神經元,就有幾個卷積核,卷積核數量決定輸出的通道數。
但是後面我們就會了解到,卷積層的表示不會再用全連接那樣的“圓圈”來表示,它有一套自己的結構表示方法,幾乎不會再提到“神經元”這個詞。
簡單瞭解這點後,我們繼續下一步:
對於激活函數這裏同樣比較直觀,就是對特徵圖中的每一個像素逐個激活。
在全連接網絡中,我們通過激活函數引入從樣本到標籤的非線性映射。
而現在,激活函數同樣能讓網絡能夠組合特徵、產生“非線性特徵”,如果沒有激活函數,我們永遠不能從“邊緣”組合出“形狀”,因為組合是非線性行為。
這就是一個卷積層的正向傳播過程了,下面我們就正式引入在網絡中,對於卷積層的符號規範。
3. 卷積層在網絡中的符號規範
一下子列舉出來,看起來會很多,但實際上很多都是之前使用的,我們也會在不斷使用中越發熟悉。
3.1 符號規範
| 符號 | 含義 | 説明 |
|---|---|---|
| \(W^{[l]}\) | 第 \(l\) 層的卷積核參數 | 形狀為 \((f, f, n_c^{[l-1]}, n_c^{[l]})\),即:核大小 × 輸入通道數 × 本層卷積核個數 |
| \(b^{[l]}\) | 第 \(l\) 層的偏置 | 每個卷積核對應一個偏置;形狀 \((1, 1, 1, n_c^{[l]})\) |
| \(A^{[l-1]}\) | 上一層的激活值(輸入特徵圖) | 形狀為 \((n_H^{[l-1]}, n_W^{[l-1]}, n_c^{[l-1]})\) |
| \(Z^{[l]}\) | 卷積後的線性輸出 | 還未進入激活函數 |
| \(A^{[l]}\) | 卷積層的激活輸出 | 對 \(Z^{[l]}\) 的每個像素逐點激活(ReLU 等) |
| \(f\) | 卷積核大小 | 若卷積核是 \(3\times 3\),則 \(f=3\) |
| \(s\) | 步幅(stride) | 每次卷積核滑動的像素數 |
| \(p\) | Padding 大小 | 圖像邊緣填充的像素數 |
| \(n_H^{[l]}\) | 第 \(l\) 層輸出特徵圖的高度 | 由公式計算得到 |
| \(n_W^{[l]}\) | 第 \(l\) 層輸出特徵圖的寬度 | 由公式計算得到 |
| \(n_c^{[l]}\) | 第 \(l\) 層輸出通道數 | 等於卷積核的數量 |
瞭解了單個符號後,下面就看看應用這些符號在正向傳播中的維度變化。
3.2 一次正向傳播中的維度變化
首先,用符號表示就是這樣:
| 階段 | 大小 |
|---|---|
| 輸入大小 | \(n_H^{[l-1]} \times n_W^{[l-1]} \times n_C^{[l-1]}\) |
| 卷積後大小 | \(n_H^{[l]} \times n_W^{[l]} \times n_C^{[l]}\) |
| 激活後大小 | \(n_H^{[l]} \times n_W^{[l]} \times n_C^{[l]}\) |
| 輸出大小 | \(n_H^{[l]} \times n_W^{[l]} \times n_C^{[l]}\) |
再舉個實例來來看看:
設置參數:\(f=3,\ s=1,\ p=1,\ n_C^{[l]}=8\),輸入為 \(32 \times 32 \times 3\)
傳播過程如下:
| 階段 | 大小(維度) |
|---|---|
| 輸入(Input) | \(32 \times 32 \times 3\) |
| Padding 後 | \((32 + 2\cdot 1) \times (32 + 2\cdot 1) \times 3 = 34 \times 34 \times 3\) |
| 卷積核(Filters) | 每個卷積核:\(3 \times 3 \times 3\);數量:8 |
| 卷積輸出 Z(未激活) | 使用公式:\(n_H^{[l]} = (34 - 3)/1 + 1 = 32\),最終:\(32 \times 32 \times 8\) |
| 激活 A(逐像素激活) | 與 Z 同維度:\(32 \times 32 \times 8\) |
| 輸出 | \(32 \times 32 \times 8\) |
我們繼續,討論一下之前提到過的網絡參數問題。
4. 卷積層的參數量
還是在第一部分裏,我們提到過,大圖片輸入全連接層會讓網絡的參數規模巨大,不僅硬件可能跟不上,更有可能出現梯度現象。
那捲積是如何緩解這個問題的呢?卷積層的參數量又是如何組織的呢?
我們還是用上面的例子來進行演示:
可以發現,對於相同的輸入,卷積網絡只需要維護 56 個參數,但是全連接網絡卻需要 218 個。
但這不是重點,218 個參數好像也不是很多。
重點在於,卷積層的參數量不因輸入圖像尺寸變化而變化。 繼續往下看:
這就是卷積相對於全連接在處理這種大尺寸,多通道且有空間結構的數據時的核心優勢所在。
最後,看一個簡單的卷積神經網絡示例。
5. 一個簡單的卷積神經網絡
現在,經過一步步引入,我們來看一個簡單的卷積神經網絡。
之後,我們就會用這種“立方體”的形式來表示卷積網絡,這也是文獻中的常用形式。
正向傳播的過程不難理解,一步步計算就可以得到,但我想你可能有一個疑惑,那就是為什麼最後的特徵圖還是要展平輸入全連接層?
我們展開一下:
5.1 卷積網絡為什麼要這麼設計?
我們通過卷積層和全連接層在這個任務中的作用來解答這個問題。
先説結論:卷積層負責“看圖”,全連接層負責“做決定”。
(1)卷積層逐步提取特徵
我們知道,圖像通過卷積層得到特徵圖,隨着層層卷積,特徵也從低級漸漸組合到高級,從邊緣,紋理漸漸組成眼睛,耳朵。
因此,我們可以説:卷積層的作用是提取圖像特徵,為後續層提供更高層次的語義特徵。
這是全連接層做不到的地方,因為它看不到空間結構。
(2)全連接層依據特徵進行決策
當然,全連接層也有自己的作用。
當卷積到最後,我們得到的特徵圖已經相當高級了,這個通道可能識別出了貓耳朵,那個通道可能識別出了貓眼睛。
但是在當前的任務要求中,我們不能把一幅圖作為輸出,即使經過激活函數,卷積層輸出的仍是特徵圖而非“結果”。
誰能根據這些信息得出結果?就是全連接層。
(3)為什麼現在又可以展平了?
我們最開始説展平會破壞空間結構,但是現在的展平,就不再有這麼大的破壞性。
為什麼?
原因很簡單:卷積層已經把圖像的空間結構“消化”得差不多了。
早期卷積層確實非常依賴空間關係,你不能隨便打亂像素位置,否則邊緣、角點、紋理這種“幾何意義”就會被破壞得一乾二淨。
但到了網絡後期,情況變了。在經歷了多次卷積之後,特徵圖已經不再是“邊緣彎曲”這種幾何信息,而更像是“耳朵是否存在”“眼睛的形狀是否明顯”“身體輪廓形狀”這樣的語義級信息。
也就是説,空間結構逐漸被抽象成了“有沒有”而不是“在哪兒”。 它們的位置影響已經遠不如它們的出現與否重要。
現在,全連接層就可以根據這些有什麼,沒有什麼來做出最後的決定。
最後,舉一個比較形象的例子:拼拼圖
我們現在有一個非常難的拼圖,非常的細碎,卷積層的作用就是把小拼塊拼成大拼塊,讓難度降低。
而全連接層就是以卷積層拼出的大拼塊為依據,識別到“原來我在拼一隻貓。”
6. 總結
| 概念 | 原理 | 比喻 |
|---|---|---|
| 多通道卷積核 | 卷積核也需匹配輸入的通道數,尺寸從 \(f\times f\) 變為 \(f\times f\times n_c\)。 | 海綿變成“疊三層的海綿”,每層分別處理 R/G/B 信息。 |
| 多維卷積輸出為單通道 | 對 R/G/B 分別卷積後相加,得到一個數 → 輸出一個特徵圖。是對同一圖像的“整體特徵”判斷。 | 你戴三種顏色濾鏡看同一蘋果,最後你只能綜合得到一個“輪廓”,不會有三個版本。 |
| 特徵圖數量(輸出通道數) | 一個卷積核提取一種特徵;多個卷積核就得到多個特徵圖,形成輸出的多個通道。 | 一組偵探同時觀察同一畫面:一個找邊緣、一個找亮度、一個找紋理 → 每人報告一頁結果。 |
| 卷積層正向傳播 | 將全連接層的 \(W A + b\) 替換為卷積運算,再對每個像素激活。 | 原來是“數字相乘”,現在換成“貼着圖像移動的小窗口掃描”。 |
| 激活函數在卷積層中的作用 | 對每一個像素位置逐點激活,使特徵產生非線性組合。 | 沒有激活就像用直尺拼圖;加了激活就像用橡皮泥,可以彎、可以變形,能組合出複雜形狀。 |
| 卷積層參數量不隨輸入尺寸變大 | 參數只依賴卷積核大小與數量,而不依賴輸入寬高。 | 海綿的孔洞數固定,不管你擦大桌子還是小桌子,海綿“設計參數”都不增加。 |
| 全連接層 vs 卷積層的分工 | 卷積層負責提取特徵;全連接層負責根據特徵分類或決策。 | 卷積層是“眼睛”,全連接層是“裁判”。 |
| 為什麼最後要展平? | 因為卷積層已經把空間結構提煉得很濃縮、很抽象,這時展平不會破壞太多信息,方便 FC 層決策。 | 像把貓的五官特徵總結成“説明書”,此時把説明書攤平給裁判看就夠了。 |