Python | OpenCV TensorFlow/Keras 微調範例
📚 前言
在上一篇 PyTorch 微調範例 中,我們完成了 PyTorch 的微調實作。
這一篇改用 TensorFlow/Keras 微調 MobileNetV2,學習另一個主流框架的實作方式。
TensorFlow/Keras 提供了高階 API,並建議分兩階段訓練:第一階段先凍結所有預訓練層,穩定分類頭的收斂;第二階段再解凍後幾層,以極小學習率進行 Fine-Tuning。這樣的做法比直接一次解凍更穩定,也更容易得到更好的結果。
🛠️ 環境安裝
1 | pip install tensorflow |

圖:執行 pip install 安裝 tensorflow 的結果
💡 以上安裝的是 CPU 版本,這篇範例使用 CPU 執行即可。GPU 加速的安裝與設定將在後續篇章介紹。
🗃️ 資料集目錄結構
圖:專案目錄結構建議 ─ 使用樹狀方式呈現原始素材、訓練資料與模型輸出的分層管理
Keras 的 image_dataset_from_directory 與 ImageDataGenerator 都支援相同的目錄結構:
1 | data/ |
☝ 這只是建議的目錄結構,並非強制規定,你可以依照自己的習慣調整。但請注意,資料夾名稱(例如 cat、dog)會被
image_dataset_from_directory自動當作類別標籤。
如何蒐集圖片?
這篇使用與上一篇相同的 cat 與 dog 資料集,直接沿用上一篇 PyTorch 微調範例 中 download_dataset.py 下載的結果即可,不需要重新蒐集。
清理不支援格式的圖片
TensorFlow 的圖片解碼器僅支援 JPEG、PNG、GIF、BMP 四種格式。BingImageCrawler 下載的圖片有時包含 WebP 或損壞的檔案,訓練時會拋出 Unknown image file format 錯誤,需先執行以下清理腳本:
1 | # clean_dataset.py |

圖:執行 clean_dataset.py 掃描並移除不支援格式或損壞的圖片
💡 PyTorch 的
ImageFolder透過 PIL 讀取,PIL 原生支援 WebP,所以上一篇不會遇到此問題。TensorFlow 使用內建圖片解碼器,格式限制較嚴,每次下載新資料集後都建議先跑一次清理腳本。
🧠 函式與參數說明
圖:TensorFlow 資料載入與模型控制 ─ image_dataset_from_directory 與 base_model.trainable 的使用說明
🗂️ 模型輸出目錄結構
訓練完成後,模型與類別設定存放在同一目錄:
1 | models/ |
config.json 內容如下:
1 | { |
🔎 訓練流程總覽
TensorFlow/Keras 建議分兩階段訓練,第一階段穩定分類頭後再解凍部分層進行微調:
圖:TensorFlow 模型訓練流程總覽 ─ 從資料載入到儲存最佳模型的完整六大步驟
💡
train.py的程式碼區塊順序就對應以上六個步驟,對照著看會清楚很多。
💻 完整範例程式
1 | # train.py |

圖:分兩階段微調 MobileNetV2,第一階段只訓練分類頭,第二階段解凍後 30 層以極小學習率進行 Fine-Tuning
💻 單張圖片推論
1 | # inference.py |

圖:載入已儲存的 Keras 模型對單張圖片進行推論並輸出預測類別與信心度
⚠️ 注意事項
- 訓練前先執行
clean_dataset.py:TensorFlow 不支援 WebP,BingImageCrawler 下載的圖片常混入此格式,且部分圖片的副檔名是.jpg但實際內容是 WebP,純靠副檔名過濾無法完全清除。clean_dataset.py改用 PIL 讀取實際格式(img.format)加上完整解碼(img.load())來確保所有問題檔案都被移除。 base_model(x, training=False):即使在訓練階段,也要對凍結的 base model 傳入training=False,確保 BatchNorm 使用推論模式的統計量,而非當前 batch 的統計量。這是 TensorFlow/Keras 遷移學習中最容易忽略的設定。preprocess_input要與 base model 對應:MobileNetV2 的preprocess_input會將像素值縮放到[-1, 1],若換用其他模型(如 ResNet50),需改用對應的preprocess_input,否則輸入分布不對會影響特徵提取效果。- 兩階段訓練的學習率差距要大:第一階段用
1e-3,第二階段建議用1e-5甚至更小,避免破壞預訓練權重。 EarlyStopping的restore_best_weights=True:確保訓練提早停止時,模型恢復到驗證最佳的狀態,而不是最後一個 epoch 的狀態。
📊 應用場景
- 快速原型驗證:Keras 的高階 API 讓你能快速跑通流程,驗證資料與模型的可行性。
- 輕量模型部署:MobileNetV2 模型小、速度快,適合部署在行動裝置或邊緣裝置。
- 有限資料下的自動調參:兩階段訓練搭配
EarlyStopping與ReduceLROnPlateau,能在訓練過程中自動降低學習率並及早停止,減少手動調參的負擔,特別適合資料量不足的場景。
🎯 結語
對比上一篇的 PyTorch 實作,TensorFlow/Keras 的兩階段訓練把 Feature Extraction 和 Fine-Tuning 合為一個完整流程,搭配 Callback 自動管理學習率與早停,整體更省力,但原理與上一篇完全相同。
下一篇進入 資料增強 (Data Augmentation),學習如何擴充訓練資料集,讓模型在資料量有限的情況下也能具備更好的泛化能力。
📖 如在學習過程中遇到疑問,或是想了解更多相關主題,建議回顧一下 Python | OpenCV 系列導讀,掌握完整的章節目錄,方便快速找到你需要的內容。
註:以上參考了
TensorFlow 官方文件 — Transfer Learning
TensorFlow 官方文件 — image_dataset_from_directory
Keras 官方文件 — Applications
