從 Day15 第一次建立 CNN Baseline Model,到昨天使用 MobileNetV2 進行 Transfer Learning,我們已經嘗試了不少改善模型的方法。
一開始,我以為調整模型就是改變 Learning Rate、Batch Size,或是增加 CNN 的 Layer。
但經過前面幾天的實驗後,我發現一個問題:
當模型表現不理想時,到底應該先調整哪個地方?
所以今天不急著建立新的模型,而是整理前面做過的實驗,看看不同調整方法分別解決什麼問題,以及如何有系統地改善模型。
在 Day15,我們第一次建立完整的 CNN,使用兩層 Conv2D 和 MaxPooling2D 進行 HAM10000 七類皮膚病灶分類。
當時的 Test Accuracy 約為 73.49%。
Baseline 的目的並不是一開始就追求最高的 Accuracy,而是先建立一個可以比較的起點。
有了 Baseline,後續每次修改模型時,才有辦法觀察調整前後的差異。
回顧前面的實驗,其實我們調整的內容可以分成幾個方向:
| 調整項目 | 主要想解決的問題 |
|---|---|
| Epoch / Early Stopping | 模型應該訓練多久? |
| Batch Size | 每次使用多少資料更新模型? |
| Learning Rate | Weight 每次應該調整多少? |
| Optimizer | 使用什麼方法更新 Weight? |
| Data Augmentation | 如何增加訓練圖片的變化? |
| Dropout | 如何降低 Overfitting? |
| CNN Architecture | 增加 Layer 是否能學到更複雜的特徵? |
| Transfer Learning | 能否利用已經學過的影像特徵? |
這些方法雖然都可能影響模型表現,但它們處理的問題並不完全相同。
因此,模型調校不應該只是隨機修改參數,而是先觀察模型遇到什麼問題,再決定要嘗試哪種方法。
如果模型的表現不理想,我們可以先觀察 Training Loss 和 Validation Loss。
例如:
情況一:Training Loss 和 Validation Loss 都很高
代表模型可能還沒有充分學習資料中的特徵。
這時可以考慮檢查 Learning Rate、訓練時間或模型架構。
情況二:Training Loss 很低,但 Validation Loss 很高
代表模型可能出現 Overfitting。
這時可以考慮 Data Augmentation、Dropout 或 Early Stopping。
情況三:整體 Accuracy 不錯,但某些類別辨識很差
這是我們在 Day25 的 Confusion Matrix 中實際看到的問題。
例如模型對 nv 的辨識能力很好,但經常將 mel 預測成 nv。
這時只繼續追求更高的 Accuracy,可能無法真正解決問題,還需要進一步觀察 Class Imbalance 和各類別的預測結果。
接下來整理幾個已經完成的實驗結果。
| 實驗 | 比較內容 | 觀察結果 |
|---|---|---|
| Learning Rate | 0.0001、0.001、0.01 | 0.001 的 Test Accuracy 最高 |
| Optimizer | Adam、SGD | Adam 在當次設定下表現較好 |
| Data Augmentation | 有/無 Augmentation | 加入後 Test Accuracy 小幅提升 |
| Dropout | 有/無 Dropout | 加入後 Test Loss 降低 |
| CNN Architecture | 2-Layer、3-Layer | 3-Layer 的 Accuracy 略高 |
| Transfer Learning | CNN、Feature Extraction、Fine-tuning | Fine-tuning 後的 MobileNetV2 表現最好 |
從這些實驗可以看到,不同方法帶來的改善程度並不相同。
有些調整可以改善 Accuracy,有些主要改變訓練過程,也有些方法在特定設定下反而讓模型表現下降。
因此:
調整模型時,不能預設某個方法一定有效,而是需要實際比較。
以下整理前面部分實驗的結果:
| 實驗 | 模型/設定 | Test Accuracy |
|---|---|---|
| Day15 | Baseline CNN | 73.49% |
| Day21 | Learning Rate = 0.001 | 74.97% |
| Day22 | Adam Optimizer | 74.30% |
| Day23 | With Data Augmentation | 74.97% |
| Day24 | With Dropout | 74.03% |
| Day27 | 3-Layer CNN | 74.97% |
| Day28 | MobileNetV2 Feature Extraction | 77.58% |
| Day28 | MobileNetV2 Fine-tuning | 78.58% |
要注意,這些數字來自不同天的實驗,雖然使用相同的 HAM10000 Dataset,但各次模型訓練可能受到隨機初始化、訓練設定及實驗條件影響。
因此這張表主要是回顧各次實驗的結果,不能直接認為每一項改善都可以累加。
例如,不能把 Data Augmentation、Dropout 和 Transfer Learning 的 Accuracy 提升幅度直接相加,就當成最終模型的表現。
經過這幾天的實驗後,我會把模型調校整理成以下流程:
建立 Baseline
↓
觀察 Training / Validation Loss
↓
檢查 Accuracy、Recall、Confusion Matrix
↓
找出主要問題
↓
選擇一項調整方法
↓
重新訓練並比較 Validation 結果
↓
保留有效的設定
↓
繼續下一項實驗
↓
選定模型後進行最終 Test 評估
例如:
如果模型出現 Overfitting,就可以先嘗試 Dropout 或 Data Augmentation。
如果 Training 和 Validation 的 Loss 都不理想,可以檢查 Learning Rate 或模型架構。
如果某些類別的辨識能力特別差,就需要進一步觀察錯誤案例,思考是否與 Class Imbalance 或影像特徵有關。
這樣每一次修改都有明確的目的,而不是只靠猜測調整模型。
從這次系列的實驗結果來看,MobileNetV2 經過 Fine-tuning 後,得到目前最高的 Test Accuracy:
78.58%
相較於 Day15 的 Baseline CNN 約 73.49%,提高了約 5.09 個百分點。
不過,這不代表模型已經達到可以實際應用於醫療診斷的程度。
前面的 Confusion Matrix 已經提醒我們,整體 Accuracy 不能代表所有類別的辨識能力。
因此,即使模型整體表現提升,仍需要檢查各類別的 Recall、錯誤案例及模型的泛化能力。
今天沒有再建立新的模型,而是回顧從 Baseline 到 Transfer Learning 的調校過程。
這幾天最大的收穫是,模型調校不是單純增加 Layer、調高 Learning Rate,或是加入越多方法越好。
更重要的是:
先找出模型的問題,再選擇合適的方法,透過實驗確認是否真的改善。
目前 MobileNetV2 Fine-tuning 在我們的實驗中取得最高的 Test Accuracy,但仍然有進一步改善的空間。
下一篇就是這次 30 天系列的最後一天,我們將回顧從最初認識 Pixel、RGB、CNN,到最後完成皮膚病灶分類模型的整個學習過程。