深度學習 - 影像辨識 - 卷積神經網路(CNN) - 以CIFAR-10為例

深度學習 - 影像辨識 - 卷積神經網路(CNN) - 以CIFAR-10為例

為什麼 MLP 認不出圖片裡的貓?今天我們將拆解 CNN (卷積神經網路) 的核心機制:卷積、池化與參數共享,並透過 CIFAR-10 貓狗分類實戰,建立你的第一個影像辨識模型。


CNN:影像辨識的數位之眼

[ML-012] 中,我們用 MLP 辨識了手寫數字。但如果我們把同樣的方法拿去認貓狗,效果往往差強人意。為什麼?因為圖片在電腦眼裡不只是數字,更是 空間結構

1. 資料集來源

資料集來源:CIFAR-10 Dataset

備註:Keras 已內建。我們只挑選其中的 貓 (Cat)狗 (Dog) 兩類來做二元分類。

資料集特色與欄位介紹:

  • 圖片格式:32x32 像素,彩色 (RGB 3 通道)。
  • 數量:訓練集 10,000 筆 (貓+狗),測試集 2,000 筆。
  • 目標 (Target):0 (貓), 1 (狗)。

2. 原理:為什麼 MLP 看不懂圖片?

2.1 核心概念:消失的空間結構

MLP 把圖片 Flatten (拉平) 了。 試想,把一張貓的照片切成一條條細絲接起來,你還認得出是貓嗎? 空間結構 (Spatial Structure) 被破壞了!眼睛和耳朵的相對位置不見了。

2.2 解決方案:CNN (卷積神經網路)

CNN 像人類的眼睛一樣,用「掃描」的方式看圖片,保留了空間特徵。它有兩大法寶:

1. 卷積層 (Convolution Layer) - 特徵提取器 (手電筒)

  • 原理:用一個小小的 濾鏡 (Filter/Kernel),在圖片上滑動 (Sliding Window),計算特徵。
  • 比喻 (手電筒)
    • 想像濾鏡是一個 「專門找圓形的手電筒」
    • 當它照到圖片上的 圓形 區域時,手電筒會 亮起來 (數值變大)
    • 卷積 就是拿著手電筒在整張圖片上 掃描,找出哪裡有線條、哪裡有邊緣。
Convolution Diagram 圖解:黃色框框就是濾鏡,它在圖片上滑動,把對應的像素值相乘再相加,得到右邊的特徵圖 (Feature Map)。

2. 池化層 (Pooling Layer) - 重點整理 (馬賽克)

  • 原理:把圖片縮小 (Downsampling)。就像把一張高畫質照片變成 「縮圖」
  • Max Pooling:在一個小區域 (例如 2x2) 內,只選最大的那個數字 代表這個區域。
  • 為什麼選最大值? 因為最大值代表這個區域 「特徵最強」 的地方 (例如最亮的點、最明顯的邊緣)。
Pooling Diagram 功能:1. 減少運算量 2. 抗雜訊 3. 平移不變性 (貓稍微移位也抓得到)。

2.3 CNN 架構示意圖 (Architecture)

CNN Architecture
  • C-P-C-P-F-D 結構
    • Conv (橘色):圖片變厚了 (濾鏡變多),但長寬變小一點 (Valid Padding)。
    • Pool (藍色):圖片長寬直接砍半。
    • Flatten (灰色):最後把立體的特徵圖拉成一條線。
    • Dense (綠色):進行最後的分類。

3. 實戰:建立貓狗分類模型

我們使用 TensorFlow / Keras 建立一個簡單的 CNN 模型:

# 關鍵程式碼:建立 CNN 模型
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv2D, MaxPooling2D, Flatten, Dense, Dropout

model = Sequential([
    # 1. 卷積層:32 個濾鏡,抓取初級特徵 (線條)
    Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)),
    
    # 2. 池化層:圖片縮小一半 (32x32 -> 16x16)
    MaxPooling2D((2, 2)),
    
    # 3. 卷積層:64 個濾鏡,抓取高級特徵 (眼睛、耳朵)
    Conv2D(64, (3, 3), activation='relu'),
    
    # 4. 池化層:圖片再縮小一半 (16x16 -> 8x8)
    MaxPooling2D((2, 2)),
    
    # 5. 接回傳統 MLP 進行分類
    Flatten(),
    Dense(64, activation='relu'),
    Dropout(0.5), # 防止過擬合 (讓 50% 神經元休息)
    Dense(1, activation='sigmoid') # 輸出是狗的機率 (0:貓, 1:狗)
])

4. 模型評估與視覺化

1. 訓練過程 (History)

Training History
  • 觀察:準確率 (Accuracy) 隨著訓練上升。如果發現 Training Acc 比 Validation Acc 高很多,這代表出現了 Overfitting (過擬合)
  • 解決方案:Dropout (丟棄法)
    • 概念:在訓練過程中,隨機讓一些神經元「休息」。
    • 比喻:就像球隊練習時,主力球員輪流休息,強迫板凳球員也要學會得分,這樣整支球隊才會強。

2. 預測結果展示 (Predictions)

Predictions
  • 觀察:模型能分辨出大部分的貓和狗。
  • 綠字:預測正確。 紅字:預測錯誤。
  • 成果:正確率 (Accuracy) 約 75%。雖然不高,但這只是簡單的 CNN。明天我們會用 遷移學習 讓準確率飆升到 90% 以上!

5. CNN 的進化史

CNN 的發展史就是一部 AI 變強的歷史:

  1. LeNet-5 (1998, Yann LeCun):CNN 的鼻祖,用於辨識手寫數字 (MNIST)。結構簡單 (5層)。
  2. AlexNet (2012, Alex Krizhevsky):深度學習的引爆點!使用了 ReLU 和 GPU 加速,在 ImageNet 大賽中以壓倒性優勢奪冠 (8層)。
  3. VGG (2014):證明了「越深越好」,結構非常規整,全部使用 3x3 卷積核 (16~19層)。
  4. ResNet (2015, Kaiming He):發明了「殘差連接 (Residual Connection)」,解決了梯度消失問題,讓網路可以深達 152 層甚至 1000 層,超越人類辨識能力。
Model Depth Evolution 圖解:從 LeNet 到 ResNet,網路深度與複雜度的進化過程。

6. 總結

Day 13 我們學習了 CNN (卷積神經網路)

  • 它解決了 MLP 破壞圖片空間結構的問題。
  • 卷積 (Convolution) 負責「看」局部特徵。
  • 池化 (Pooling) 負責「縮小」圖片並保留重點。
  • 這個架構是現代人臉辨識、自動駕駛系統的基石。