Python | OpenCV PyTorch 微調範例
📚 前言
在上一篇 遷移學習與微調原理 中,我們了解了 Feature Extraction、Fine-Tuning、Full Training 三種策略,以及如何根據資料量做選擇。
這一篇進入實作,完整示範如何用 PyTorch 將 ResNet18 以 Feature Extraction 策略微調為自訂分類模型。程式碼的每個環節都對應上一篇的原理,建議對照閱讀。
🛠️ 環境安裝
1 | pip install torch torchvision |

圖:執行 pip install 安裝 torch 與 torchvision 的結果
💡 以上安裝的是 CPU 版本,這篇範例使用 CPU 執行即可。GPU 加速的安裝與設定將在後續篇章介紹。
🗃️ 資料集目錄結構
圖:專案目錄結構建議 ─ 使用樹狀方式呈現原始素材、訓練資料與模型輸出的分層管理
PyTorch 的 ImageFolder 會自動依資料夾名稱建立類別對應,目錄結構如下:
1 | data/ |
☝ 這只是建議的目錄結構,並非強制規定,你可以依照自己的習慣調整。但請注意,資料夾名稱(例如 cat、dog)會被 ImageFolder 自動當作類別標籤。
如何蒐集圖片?
這篇範例使用 cat 與 dog 兩個類別。可以用在 資料蒐集 篇介紹過的 BingImageCrawler 批次下載,分別蒐集訓練集與驗證集:
1 | # download_dataset.py |

圖:使用 BingImageCrawler 批次下載 cat 與 dog 圖片並分別存入 train/val 資料夾
💡
max_num是下載上限,不保證一定能下載到該數量,實際數量取決於 Bing 的搜尋結果。訓練時只要每類有 50 張以上即可正常執行。
⚠️ 注意版權問題,建議僅用於研究與學習目的。
🧠 函式與參數說明
圖:資料載入的兩個核心工具 ─ ImageFolder 與 DataLoader 的功能與常用參數說明
🗂️ 模型輸出目錄結構
訓練完成後,模型權重與類別設定會存放在同一個目錄,方便日後對應使用:
1 | models/ |
config.json 內容如下:
1 | { |
推論時先讀 config.json,就不會忘記當初訓練的類別數與名稱。
🔎 訓練流程總覽
在看程式碼之前,先了解整個流程的每個步驟在做什麼:
圖:PyTorch 模型訓練流程總覽 ─ 從資料前處理到儲存最佳模型的完整六大步驟
💡
train.py的程式碼區塊順序就對應以上六個步驟,對照著看會清楚很多。
💻 完整範例程式
採用 Feature Extraction 策略:凍結所有預訓練層,只訓練替換後的分類頭。每類資料量在 200 張以下時,這是最穩健的起手方式。
1 | # train.py |

圖:凍結 ResNet18 預訓練層後只訓練分類頭,完整執行訓練與驗證迴圈並儲存最佳模型
💻 單張圖片推論
訓練完成後,用以下程式驗證模型對單張圖片的推論結果。測試圖片可直接使用驗證集中的任一張,例如 data/cat_dog/val/cat/000001.jpg:
1 | # inference.py |

圖:載入已訓練的 ResNet18 模型對單張圖片進行推論並輸出預測類別與信心度
⚠️ 注意事項
- 換任務時
NUM_CLASSES要同步修改:TASK_NAME只控制資料路徑與模型儲存位置,類別數需手動更新。兩者不一致會導致模型輸出維度錯誤,訓練時直接報錯。 num_workers在 Windows 上設 0:設成其他數值在 Windows 上可能造成 DataLoader 死鎖。- 驗證集不做資料增強:
val_transform只做 Resize 與 Normalize,不做翻轉或旋轉,確保評估結果穩定。 model.eval()與torch.no_grad():驗證與推論時都必須同時呼叫,前者關閉 Dropout/BatchNorm 的訓練行為,後者節省記憶體並加速計算。scheduler.step()的位置:需在每個 epoch 結束後呼叫,而非每個 batch 後。
📊 應用場景
- 寵物品種辨識:以本篇的 cat/dog 分類為基礎,擴展到更多品種,只需調整
TASK_NAME、NUM_CLASSES與對應的訓練資料即可。 - 自訂商品分類:以少量商品圖片微調,建立特定品類辨識模型。
- 工廠品管:辨識生產線上的良品與瑕疵品,每個產品線建立獨立的任務目錄,互不干擾。
🎯 結語
這篇完整示範了 Feature Extraction 策略在 PyTorch 的實作,從資料集準備、模型建立、訓練迴圈到推論,每個環節都對應上一篇介紹的原理。
跑完整個流程之後,如果想進一步提升準確率,可以試著按照上一篇的建議逐步解凍 layer4,加入 Fine-Tuning。
下一步是 TensorFlow/Keras 微調範例,換一個框架做同樣的事,對比之下會更容易理解兩者的差異。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。
註:以上參考了
PyTorch 官方文件 — Transfer Learning Tutorial
PyTorch 官方文件 — torchvision.datasets
PyTorch 官方文件 — torch.optim
