
—
深度學習 - 遷移學習 - 以VGG修改為10類分類為例
訓練一個大型模型需要數週時間?今天我們將學習如何「借用」Google 與 Microsoft 訓練好的大腦 (VGG, ResNet),用極少量的資料與時間,解決複雜的影像辨識任務。
WRITTEN BY

- Name
- Harry Chang
遷移學習:不要重複造輪子
在 [ML-013] 中,我們建立了自己的第一個 CNN 模型。但如果你想讓電腦認出 1000 種 不同的物體,或者你手上只有 幾百張 圖片,該怎麼辦?這就是 遷移學習 (Transfer Learning) 大顯身手的時候。
借用巨人的腦袋
"Don't Reinvent the Wheel" (不要重複造輪子) 是程式設計的名言。 訓練一個像 VGG16 或 ResNet 這樣的大型模型,需要 數百萬張圖片 和 數週的 GPU 運算時間。我們凡人沒有這種資源,但我們可以 「借用」 他們訓練好的腦袋,來解決我們自己的問題。
常用的預訓練模型 (The Giants)
- VGG (16~19 層):特色是全部使用 3x3 小卷積核。雖然參數多,但非常適合新手學習與改裝。
- ResNet (50~152 層):特色是殘差連接 (Skip Connection),解決了深層網路梯度消失的問題,讓網路能突破 100 層。
- MobileNet (輕量級):專為手機/邊緣裝置設計,運算量大幅降低。
- EfficientNet:目前的效能與運算量 CP 值之王。
1. 資料集來源
資料集來源:CIFAR-10 Dataset
備註:這次我們挑戰完整的 10 類分類。為了模擬真實世界「資料不足」的情況,我們只取 2000 筆 資料來訓練 (原本有 50000 筆)。
2. 原理:什麼是遷移學習?
2.1 核心概念:技能的轉移
- 巨人的腦袋 (Convolutional Base):負責看線條、形狀、紋理。這是通用的能力。
- 我們的尾巴 (Custom Classifier):負責根據腦袋看到的特徵,分辨出我們指定的 10 類。
圖解:鎖住 (Locked) 腦袋提取特徵,訓練 (Trainable) 尾巴進行分類。2.2 具體作法:特徵提取 (Feature Extraction)
- 凍結 (Freeze):把預訓練模型的 卷積層 (腦袋) 鎖起來,不讓它變動。
- 替換 (Replace):砍掉原本的分類層,換上我們自己的分類層 (分 10 類)。
- 訓練 (Train):只訓練我們新接上去的那幾層。
3. 實戰:使用 VGG16 進行遷移學習
我們使用 VGG16 模型作為基礎:
# 關鍵程式碼:使用 VGG16 進行遷移學習
from tensorflow.keras.applications import VGG16
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Flatten
# 1. 載入 VGG16 (不包含原本的分類層 include_top=False)
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(32, 32, 3))
# 2. 凍結卷積層 (鎖住腦袋)
for layer in base_model.layers:
layer.trainable = False
# 3. 接上自己的分類層 (裝上新尾巴)
x = base_model.output
x = Flatten()(x)
x = Dense(256, activation='relu')(x)
predictions = Dense(10, activation='softmax')(x) # 分 10 類
# 4. 建立新模型
model = Model(inputs=base_model.input, outputs=predictions)
4. 模型評估與視覺化
1. 訓練過程 (History)

- 觀察:即使資料只有 2000 筆,模型也能快速收斂。如果是從頭訓練 CNN,這麼少的資料通常會導致學不起來。
2. 預測結果展示 (Predictions)

- 成果:正確率 (Accuracy) 約 45% ~ 50%。
5. 為什麼效果不好?遷移學習的注意事項
你可能會疑惑:「既然借用了巨人的腦袋,為什麼正確率只有 50%?」 這是因為在實務中,遷移學習有幾個關鍵的細節會決定成敗:
5.1 解析度不匹配 (Resolution Mismatch)
- 問題:VGG16 原本是用 224x224 的大圖訓練的,但 CIFAR-10 只有 32x32。
- 解析:對 VGG 來說,這些圖片就像是高度近視看到的一樣模糊,它原本學到的「精細特徵」派不上用場。
- 解決方案:在輸入層前加入
UpSampling2D將圖片放大,準確率通常能直接飆升。
5.2 資料領域差異 (Domain Gap)
- 問題:巨人的腦袋是在 ImageNet (貓、狗、車、日常用品) 上訓練的。
- 解析:如果你的任務是辨識「衛星雲圖」或「醫學 X 光片」,巨人根本沒看過這種東西,它學會的「日常物體邊緣」效果就會打折。
- 解決方案:這時需要 Fine-tuning (微調),解凍最後幾層卷積層一起訓練。
5.3 訓練策略:特徵提取 vs. 微調
- 特徵提取 (本次做法):只訓練新尾巴,腦袋不動。適合資料極少或硬體極爛時。
- 微調 (Fine-tuning):先用特徵提取訓練一陣子,再把腦袋最後幾層解凍,用超小的 Learning Rate 一起訓練。這才是達到 90% 以上準確率的關鍵。
6. 什麼情況適合使用遷移學習?
- 資料量極少:當你只有幾百張圖片時,從頭訓練 CNN 必死無疑 (會嚴重 Overfitting),遷移學習是唯一出路。
- 時效要求高:如果你希望在幾分鐘內就訓練出一個堪用的模型。
- 算力不足:沒有多張專業顯卡,無法承受數週的訓練成本。
7. 總結
Day 14 我們學習了 遷移學習 (Transfer Learning):
- 我們不需要從零開始。
- 我們可以站在Google (VGG/Inception) 或 Microsoft (ResNet) 的肩膀上。
- 只要「凍結」前面的層,「訓練」後面的層,就能用極少的資料訓練出不錯的模型。
下一章我們將進入 RNN (循環神經網路)。之前的模型都是看「靜態圖片」,但如果資料是「有時間順序」的 (如股票、文字、語音) 該怎麼辦?