昨天我們比較了 2-Layer CNN 和 3-Layer CNN,發現增加一層 Convolution Layer 後,Test Accuracy 從 74.43% 提升到 74.97%。
雖然有小幅改善,但這讓我開始思考:
如果不從零開始訓練 CNN,而是使用已經學過大量圖片的模型,結果會不會更好?
所以今天要介紹 Transfer Learning(遷移學習),看看能不能利用 Pre-trained Model,改善目前的皮膚病灶分類結果。
前面建立的 CNN,都是從隨機初始化的 Weight 開始訓練。
模型必須自己從 HAM10000 的圖片中,逐漸學習邊緣、顏色、紋理等影像特徵。
但如果有一個模型,已經在大量圖片上訓練過呢?
Transfer Learning 的概念,就是將模型在其他任務中學到的知識,轉移到目前的新任務。
例如某個已經在大量圖片上訓練的模型,學過邊緣、紋理、形狀等影像特徵,我們保留部分已學到的能力,應用到 HAM10000 皮膚病灶分類,這樣就不需要讓模型完全從零開始學習所有影像特徵。
不過,原本模型學習的圖片不一定是醫學影像,因此 Transfer Learning 也不保證一定會比自己建立的 CNN 好。
Pre-trained Model(預訓練模型)就是已經使用其他資料完成訓練的模型。
常見的影像分類模型包括:
| 模型 | 特點 |
|---|---|
| VGG16 | 架構較直觀,但參數數量較多 |
| ResNet | 使用 Residual Connection,幫助訓練較深的網路 |
| MobileNetV2 | 相對輕量,適合運算資源有限的環境 |
| EfficientNet | 透過架構設計平衡模型規模與效率 |
這次選擇 MobileNetV2,並使用在 ImageNet 上預訓練的權重。
ImageNet 包含大量一般物體圖片,雖然和皮膚病灶影像不同,但模型已經學到一些可以重複利用的影像特徵。
Feature Extraction(特徵擷取)是 Transfer Learning 常見的使用方式。
做法是先保留 Pre-trained Model 已經學到的 Weight,不讓它們在訓練過程中改變。
接著,在模型後面加入新的分類層,讓它學習目前的 HAM10000 七種類別。
HAM10000 Image
↓
MobileNetV2
(保留原本的 Weight)
↓
Global Average Pooling
↓
Dense
↓
7-Class Output
在 TensorFlow 中,可以使用:
base_model.trainable = False
這表示先凍結 Pre-trained Model 的參數,因此這個階段主要訓練新加入的分類層,而不是重新訓練整個 MobileNetV2。
如果只使用 Feature Extraction,模型原本學到的特徵可能不完全適合皮膚病灶圖片。
因此還可以進一步使用 Fine-tuning(微調)。
Fine-tuning 會開放 Pre-trained Model 的部分 Layer,讓模型根據 HAM10000 的圖片,調整原本的 Weight。
Fine-tuning 通常會使用比較小的 Learning Rate,避免更新幅度過大,破壞原本已經學到的特徵。
不過 Fine-tuning 並不保證一定改善結果,也可能因為資料量有限或設定不適合而出現 Overfitting。
這次延續 HAM10000 Dataset,使用 MobileNetV2 進行七類皮膚病灶分類。
與前面自己建立的 CNN 不同,這次使用已經在 ImageNet 上訓練好的模型作為特徵擷取器。
base_model = tf.keras.applications.MobileNetV2(weights="imagenet",include_top=False,input_shape=(160, 160, 3))
base_model.trainable = False
其中:
weights="imagenet":載入 ImageNet 預訓練權重include_top=False:移除原本的分類層input_shape:設定輸入圖片尺寸trainable=False:先凍結預訓練模型接著再加入新的分類層,讓模型學習 HAM10000 的七種類別。
需要注意,MobileNetV2 有自己的影像前處理方式,因此不能直接把前面 CNN 使用的 Normalization 設定原封不動套用。
這次我們可以分成三個階段:
模型一:3-Layer CNN 從零開始訓練
模型二:MobileNetV2 Feature Extraction
模型三:MobileNetV2 Feature Extraction + Fine-tuning
這次我主要想觀察:
使用 Pre-trained Model,是否真的能比自己建立的 CNN 有更好的分類表現?
比較時使用相同的 HAM10000 資料切分,並根據不同模型的需求進行適當的影像前處理。

這次將 MobileNetV2 的 Feature Extraction 和 Fine-tuning 兩個階段進行比較。
從曲線可以看到,Feature Extraction 階段的 Validation Loss 從約 0.78 逐漸下降到 0.66 左右,但後期仍有一些波動。
進入 Fine-tuning 後,Validation Loss 進一步下降,最低約為 0.63,比 Feature Extraction 階段更低。
這表示在這次實驗中,解凍部分預訓練 Layer,讓模型進一步學習 HAM10000 的影像特徵,確實改善了 Validation Loss。
不過 Fine-tuning 的 Validation Loss 仍有波動,因此不能認為解凍越多 Layer 就一定越好。
最後使用相同的 Test Data,比較三種模型的分類結果:
| 模型 | Test Loss | Test Accuracy |
|---|---|---|
| 3-Layer CNN | 0.6831 | 73.16% |
| MobileNetV2(Feature Extraction) | 0.6586 | 77.58% |
| MobileNetV2(Fine-tuning) | 0.6452 | 78.58% |
從結果可以看到,MobileNetV2 在 Feature Extraction 階段就達到 77.58% 的 Test Accuracy,比原本的 3-Layer CNN 高出約 4.42 個百分點。
進一步 Fine-tuning 後,Test Accuracy 提升到 78.58%,Test Loss 也從 0.6586 降低到 0.6452。
這次實驗中,Fine-tuning 後的 MobileNetV2 在三種模型中有最高的 Test Accuracy 和最低的 Test Loss。
不過這不代表 Transfer Learning 一定比自己建立的 CNN 好,實際效果仍然會受到資料、模型架構及訓練設定影響。
今天透過 MobileNetV2,實際比較了從零開始訓練 CNN、Feature Extraction,以及 Fine-tuning 三種方式。
實驗結果中,使用 Pre-trained Model 後,Test Accuracy 從 73.16% 提升到 77.58%,進一步 Fine-tuning 後則達到 78.58%。
這讓我發現,利用模型已經學到的影像特徵,再針對目前的資料進行調整,確實有機會比完全從零開始訓練得到更好的結果。
不過模型的整體 Accuracy 提升,不代表所有皮膚病灶類別都辨識得更好,仍然需要考慮 Class Imbalance 與不同類別的預測情況。
下一篇,我們將整理前面嘗試過的各種模型調整方法,看看哪些方法帶來改善,以及如何選擇適合目前資料的模型。
今天認識了 Transfer Learning,以及兩種常見的使用方式:Feature Extraction 和 Fine-tuning。
Feature Extraction 先保留 Pre-trained Model 的權重,只訓練新的分類層;Fine-tuning 則進一步調整部分預訓練 Layer,讓模型有機會更適合目前的資料。
不過:
Pre-trained Model 並不保證一定比從零開始建立的 CNN 更好,仍然需要透過實驗比較。
下一篇,我們將整理前面嘗試過的模型調整方法,看看哪些設定真正帶來改善,以及如何選擇適合目前資料的模型。