我們完成了數據的結構化分割,並實作了 DataLoader,將乾淨的圖片轉化為模型可食用的數據流。今天,我們將正式進入訓練環節:首先進行快速的 Stage 1 訓練,然後進入關鍵的 Stage 2 微調 (Fine Tuning),並開始比較三個模型的性能。
一、遷移學習基底模型介紹
我的專案目標是找出最適合自然災害影像分類的模型。我選擇了三種在深度學習領域具有代表性和不同優勢的 CNN 架構作為我的媽媽:
| 模型架構 | 核心設計與特性 | 優勢與應用場景 | 專案定位 |
|---|---|---|---|
| ResNet34 | 殘差連接 (Residual Blocks):緩解梯度消失,允許更深網路穩定訓練。 | 學習穩定、收斂快,是公認可靠的基準模型。 | 穩定性標準:觀察訓練過程的可靠性。 |
| VGG16 | 小卷積核 3×3 堆疊:以連續小核增深度與非線性,結構清晰、直觀。 | 架構容易理解,適合觀察淺層特徵的學習情況。 | 對比模型:用於比較與 ResNet 的差異。 |
| EfficientNet-B0 | 複合縮放 (Compound Scaling):同時平衡深度、寬度、解析度以提升效率。 | 參數少、效率高,適合資源受限或快速推理的場景。 | 高效模型:評估在高準確率下降資源消耗。 |
二、多模型 Stage 1 訓練:凍結與分類頭訓練
在 Stage 1,我們只用 ImageNet 權重初始化模型,然後凍結卷積基底,只訓練替換後的分類頭,快速讓模型適應新的災害類別。
from fastai.vision.all import *
# 載入 ResNet34 預訓練模型
learn_resnet = cnn_learner(dls, resnet34, metrics=accuracy)
# cnn_learner 自動:載入 ImageNet 權重、凍結卷積基底、替換分類頭。

# 訓練 ResNet34, VGG16, EfficientNetB0
learn_resnet.fit_one_cycle(3, lr_max=1e-3)
learn_vgg.fit_one_cycle(3, lr_max=1e-3)
learn_effnet.fit_one_cycle(3, lr_max=1e-3)
# 儲存 Stage 1 權重為 Stage 2 做準備
myModel = myPath + '/resnet34_stage-1'
learn_resnet.save(myModel)
三、Stage 2 核心策略:解凍與微調 (Unfreeze & Fine-tune)
Stage 1 提供了基本分類能力。為了讓模型能學習自然災害影像特有的高階特徵,我們必須進入更關鍵的 Stage 2。



# 重新載入 Stage 1 權重並解凍模型
learn_resnet.load('resnet34_stage-1')
learn_resnet.unfreeze()
# 使用差別學習率進行 6 個 Epoch 的微調
learn_resnet.fit_one_cycle(6, slice(1e-6, 1e-4))
# slice(1e-6, 1e-4) 是微調的精髓:淺層權重微調,深層權重調整幅度較大。
觀察: 驗證集損失 (valid_loss) 顯著下降,準確度 (accuracy) 穩定在 95.79% 左右。這證明 Stage 2 微調策略成功讓模型找到了高泛化能力的權重。