經過前幾天的 CNN 核心機制與現代架構練功,我們知道從零開始訓練高性能模型既耗資料又吃算力。遷移學習就是把在大型資料集上學到的通用視覺知識,轉移到你的新任務,達到高準確、低資源的實戰目標。
一、遷移學習的動機與核心思想
任務例:辨識工廠五種產品缺陷
條件:僅有數百張影像,無法負擔從零訓練的大型網路
在 ImageNet 等大規模資料上訓練的模型,淺層卷積會學到通用特徵:邊緣、角點、顏色梯度、紋理、簡單形狀
這些特徵對多數影像任務都適用 → 把通用特徵帶到你的小數據任務上
二、核心機制:預訓練模型的結構拆解
已在大型公開資料上完成訓練的 CNN 模型,例如 VGG16、ResNet34
權重已學到良好的通用表徵,可直接拿來當特徵抽取器
| 部位 | 作用 | 推薦處理方式 |
|---|---|---|
| 卷積基底 Convolutional Base | 提取通用視覺特徵 邊緣 形狀 紋理 | 先凍結 Freeze 權重 |
| 分類器頭部 Classifier Head | 針對任務做最終分類 | 替換為新任務類別數 重新訓練 |
三、兩種常見的遷移策略
做法:完全凍結卷積基底,只訓練新的分類頭
適用:資料量少,且新舊任務相似度高
優點:快速、穩健、過擬合風險低
做法:先用預訓練權重,解凍最後幾層卷積,配很小學習率再訓練
適用:資料較多,或新舊任務差異大 例如從自然影像轉醫療 X 光
優點:通用特徵會被微調以貼近新領域
四、實作範例速抄
以下程式碼展示了如何將 ResNet34 的卷積基底凍結,並為 num_classes = 5 的新任務替換分類頭。
import torch, torch.nn as nn
from torchvision import models
num_classes = 5
//準備工作: 引入 PyTorch 庫和 torchvision 中的預訓練模型。設定新任務的類別數為 5。
model = models.resnet34(weights=models.ResNet34_Weights.IMAGENET1K_V1)
// 載入基底模型: 載入 ResNet34 模型,並使用在 ImageNet-1K 資料集上訓練好的權重。此時模型已具備強大的特徵提取能力。
for p in model.parameters():
p.requires_grad = False
//凍結卷積基底: 遍歷模型的所有參數,將它們的 requires_grad 屬性設為 False。這意味著在後續的訓練中,卷積層的權重將不再更新(被「凍結」)。
in_f = model.fc.in_features
//擷取輸入維度: 取得 ResNet34 原始全連接層 (model.fc) 的輸入特徵數量。這個數值代表卷積基底輸出的特徵維度。
model.fc = nn.Linear(in_f, num_classes)
//替換分類頭: 用一個全新的全連接層替換原有的分類層。新層的輸入維度保持不變 (in_f),但輸出維度被設為新任務的類別數 (num_classes = 5)。
optimizer = torch.optim.Adam(model.fc.parameters(), lr=1e-3)
只優化分類頭: 建立優化器 (Adam),但只將新替換的 model.fc 層參數傳入。這確保了在訓練期間,只有分類頭的權重會被學習和更新,而前面凍結的卷積層保持不變。
遷移學習是深度學習在資源有限情境下的黃金法則。
它不再要求我們從零開始「造輪子」,而是讓我們站在 ImageNet 時代巨人的肩膀上。透過巧妙地凍結通用特徵(卷積基底)與重塑決策結構(分類頭),我們得以用更少的資料、更短的時間,快速建立起一個具備高準確度的影像分類系統。在追求效率和部署速度的實戰應用中,掌握遷移學習,就是掌握了通往高效 AI 專案的快速通道。