昨天我們回顧了 CNN 的歷史演進,今天要實際看看 CNN 在「日常運作」時是怎麼處理一張圖片的。
DNN 雖然也能處理圖片,但它需要將圖片展平成一維向量,這樣會 破壞像素之間的鄰近關係,而且參數數量暴增。
CNN 的誕生,就是為了保留空間結構,並高效地提取局部特徵。
一、輸入影像 (Input Layer)
當一張圖片進入 CNN 時,它會先被轉換成一個數字矩陣,每個元素對應到一個像素值。
例如手寫數字資料集 (MNIST) 的影像大小是 28×28,對應到 784 個數字特徵。
可以把這一步想像成遊戲的「地圖讀取」,CNN 需要先完整讀進整張地圖,才能開始冒險。
二、卷積層 (Convolution Layer)
CNN 的核心技能就是「卷積運算」。卷積層會使用小小的矩陣(Filter 或 Kernel),像一個「特徵偵測器」,在圖片上滑動並檢查局部區域。這個運算過程是:Filter 與區域進行點乘,再把結果加總,最後得到一張新的「特徵圖 (Feature Map)」。卷積層之所以強大,來自幾個設計:
權重共享 (Weight Sharing):同一個 Filter 掃整張圖,讓參數量大幅減少。
Padding:在圖片邊界補零,避免特徵在邊緣被忽略。
Stride:決定 Filter 每次滑動的步幅,會直接影響輸出的尺寸。
卷積層的角色,就像是玩家拿著放大鏡,一格一格掃描地圖,把重要的細節標記出來。
三、激活函數 (Activation Function)
在完成卷積後,CNN 還需要透過激活函數來引入非線性能力,否則整個網路再多層也只是一個線性函數。目前最常用的是 ReLU (Rectified Linear Unit),它的規則很簡單:輸入小於 0 的部分直接歸零,輸入大於 0 的部分原樣輸出。激活函數就像是在地圖上「加強亮點標記」,把沒用的訊號忽略,只留下有意義的部分。
四、池化層 (Pooling Layer)
為了讓運算更有效率,CNN 還會使用池化層來縮小圖片,濃縮資訊並降低計算量。最常見的方法是 MaxPooling,它會在一個小區域內挑出最大值,作為該區域的代表特徵。這一步驟就像冒險者整理背包,只留下最強的裝備,把無關緊要的東西丟掉,讓整體更輕便。
五、多層堆疊
CNN 的強大之處在於可以不斷堆疊「卷積 → 激活 → 池化」的組合,逐層學習更高階的特徵。
在前幾層,網路學到的可能是邊緣或顏色;再往後一些層,它會捕捉形狀和局部結構;等到最後幾層,網路已經能夠辨識完整的物件,例如數字、臉孔或車輛。「由淺入深」的特徵抽象能力,使 CNN 成為影像辨識的明星架構。
六、展平與分類 (Flatten & Fully Connected Layer)
當 CNN 完成特徵提取後,最後一步是把特徵圖 展平 (Flatten) 成一維向量,再送進傳統的全連接層 (Fully Connected Layer, FC)。像一個最終判斷器,會整合所有學到的特徵,並透過 Softmax 輸出每個類別的機率。
此時,CNN 的 Forward Pass 就結束了:它會告訴你「這張圖是狗?還是貓?」
整個 CNN 的前向傳播流程就像一場冒險破關:
輸入圖片 → 卷積 → 激活 → 池化 → 多層堆疊 → 展平 → 全連接層 → 最終分類。
明天,我們將繼續深入,看看 CNN 如何透過反向傳播 (Backward Pass) 從錯誤中學習,調整自己的 Filter,讓模型越來越強。