AI時代系列(2) 機器學習三部曲: 🔹 第二部:《深度學習 —— 神經網路的革命》
30/100 第三週:📌 卷積神經網路 CNN
30.小結與測驗:貓狗分類器 🐱🐶 自己訓練會辨別的眼睛!
________________________________________
✅ 一、單元重點總覽(第 21~29 節)
- 21. CNN 誕生與應用 👁🗨:模仿視覺皮質,擅長圖像辨識與處理
- 22. 卷積層原理 🧩:濾鏡提取邊緣、紋理等局部特徵
- 23. 池化層 📉:降低特徵圖維度,提升容錯與運算效率
- 24. 步長與填充 ⛓:控制輸出尺寸與特徵保留程度
- 25. 多通道與濾鏡輸出 🎨:處理 RGB 圖像並提取多組特徵
- 26. CNN 經典架構 🏛:涵蓋 LeNet、AlexNet、VGG、ResNet 等應用
- 27. 批次正規化 ⚖:穩定訓練、加快收斂、減少過擬合風險
- 28. Flatten + Dense 📐:轉為向量輸出類別機率分布
- 29. 圖像增強與資料擴充 📸:模擬真實變化,強化泛化能力
________________________________________
📝 二、觀念測驗題
(單選題 5 題 + 簡答題 3 題)
________________________________________
✅ 單選題(共 5 題)
1️⃣ 卷積層中濾鏡的主要功能是?
A. 儲存訓練結果
B. 增加參數數量
C. 擷取局部空間特徵
D. 刪除雜訊資訊
✅ 正解:C
🧠 解析:濾鏡(filter)在圖像中滑動,主要目的就是提取如邊緣、紋理、角度等局部特徵。
________________________________________
2️⃣ 下列哪一個層級的作用是「降低特徵圖尺寸、提升容錯能力」?
A. 卷積層
B. 池化層
C. Flatten 層
D. Dense 層
✅ 正解:B
🧠 解析:池化層(如 MaxPooling)用來壓縮特徵圖空間大小,同時保留重要特徵並提升模型對於位置偏移的容忍度。
________________________________________
3️⃣ 使用 padding='same' 時,卷積操作的結果會?
A. 輸出特徵圖尺寸等於輸入
B. 輸出縮小
C. 輸出擴大
D. 僅適用於池化層
✅ 正解:A
🧠 解析:same padding 會在邊緣補 0,確保輸出特徵圖尺寸與輸入相同(前提是 stride=1)。
________________________________________
4️⃣ 為了增加訓練資料的多樣性並提升泛化力,應該使用下列哪一方法?
A. Batch Normalization
B. Flatten
C. Image Augmentation
D. Dropout
✅ 正解:C
🧠 解析:圖像增強(Image Augmentation)是模擬圖片的角度、亮度、位置、翻轉等方式,有效提高模型泛化能力。
________________________________________
5️⃣ 哪一層的輸出最常直接用來進行分類?
A. Conv2D
B. MaxPooling2D
C. Flatten
D. Dense(全連接層)
✅ 正解:D
🧠 解析:分類模型的最後一層通常為 Dense 層,搭配 Sigmoid 或 Softmax 輸出對應類別的機率分佈。
________________________________________
✍️ 簡答題(共 3 題)
Q1. 為什麼 CNN 比 MLP 更適合處理圖像?請列舉至少兩項理由。
✅ 參考解答:
1. CNN 能保留圖像的空間結構(不像 MLP 要扁平化輸入)
2. 卷積濾鏡具有局部感知與參數共享特性,可有效捕捉圖像特徵
3. CNN 訓練參數少於 MLP,計算效率高且較不易過擬合
________________________________________
Q2. 請說明 Batch Normalization 的作用與訓練中放置的位置。
✅ 參考解答:
Batch Normalization 可將每層輸入特徵標準化,穩定梯度傳遞、加快模型收斂,並具有正則化效果。
它通常放在「Conv 或 Dense 層後、ReLU 激活函數前」。
________________________________________
Q3. 假如你發現模型在訓練集準確率高但驗證集很差,你會怎麼調整 CNN 架構?
✅ 參考解答:
這是典型過擬合問題,可採用:
• 加入 Dropout 或增加 Dropout 比例
• 使用資料擴充(Image Augmentation)
• 降低模型複雜度(減少濾鏡或 Dense 神經元數量)
• 引入 EarlyStopping、正則化(L2)
________________________________________
🎮 三、實作練習:簡易 CNN 貓狗分類器 🐶🐱
📦 使用 TensorFlow 內建影像增強與模型流程
python
import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.preprocessing.image import ImageDataGenerator
# 圖像增強
train_datagen = ImageDataGenerator(
rescale=1./255,
rotation_range=15,
zoom_range=0.1,
horizontal_flip=True,
validation_split=0.2
)
train_generator = train_datagen.flow_from_directory(
'dataset/cats_and_dogs/',
target_size=(128, 128),
batch_size=32,
class_mode='binary',
subset='training'
)
val_generator = train_datagen.flow_from_directory(
'dataset/cats_and_dogs/',
target_size=(128, 128),
batch_size=32,
class_mode='binary',
subset='validation'
)
這段程式碼透過 ImageDataGenerator 結合目錄載入功能,實現影像的即時資料增強與資料劃分,並將資料整理成適合 Keras 模型訓練的格式。這種方式不但能提升模型對於圖像變異的泛化能力,還方便進行大規模圖片分類任務,是圖像分類實作中最常用的資料前處理策略之一。
____________________________________
🧠 模型架構設計(簡易版 CNN)
python
model = models.Sequential([
layers.Conv2D(32, (3, 3), activation='relu', input_shape=(128, 128, 3)),
layers.MaxPooling2D(2, 2),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D(2, 2),
layers.Flatten(),
layers.Dense(64, activation='relu'),
layers.Dense(1, activation='sigmoid') # 二分類:貓 or 狗
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
model.fit(train_generator, validation_data=val_generator, epochs=10)
這段程式碼構建並訓練了一個用於辨識貓與狗的卷積神經網路(CNN)。模型包含兩組卷積與池化層,用來提取影像特徵,經過展平後接入全連接層,最後以 sigmoid 函數輸出二元分類結果。編譯時使用 Adam 最佳化器與 binary crossentropy 損失函數,並以準確率作為評估指標。透過 train_generator 與 val_generator 載入增強後的影像資料,進行 10 個 epoch 的訓練,可有效學習貓狗影像特徵並具備良好泛化能力。
________________________________________
📊 結果評估與觀察:
• 訓練過程中可視化 accuracy / loss 曲線
• 可用混淆矩陣檢查哪一類易誤判
• 可使用 Grad-CAM(進階)觀察模型「看哪裡」
________________________________________
🎯 小結與啟示:
✅ CNN 能自動從圖像中學習多階層特徵
✅ 每層結構都有特定功能:濾鏡提特徵、池化降維、Flatten 全連接分類
✅ 實務中需搭配資料擴充與正規化機制,提升模型泛化與穩定性