終於來到第 30 天了!回想 Day1,我們從一個很基本的問題開始:
電腦真的看得懂圖片嗎?
當時我們先認識 Computer Vision,接著從 Pixel、RGB、Channel 開始,慢慢了解電腦是怎麼處理圖片的。
後來開始使用 HAM10000 Dataset,建立第一個 CNN,調整 Learning Rate、Batch Size、Optimizer,甚至嘗試 Data Augmentation、Dropout 和 Transfer Learning。
一路做到現在,我發現自己對 AI 的理解,和一開始有了不太一樣的想法。
以前可能會比較在意模型能不能順利訓練、Accuracy 有沒有提升,但經過這 30 天,我開始更重視:
為什麼模型會得到這個結果?又該怎麼判斷它是不是真的變好了?
所以最後一天,想回顧這 30 天的實驗,也整理一些過程中學到的事情。
這次的學習過程,大致可以分成四個階段。
| 階段 | 學習內容 |
|---|---|
| Day1~Day9 | Computer Vision、Pixel、RGB、Preprocessing、Dataset、Class Imbalance、資料切分 |
| Day10~Day18 | Neural Network、CNN、Convolution、Pooling、Loss、Accuracy、Overfitting |
| Day19~Day24 | Epoch、Batch Size、Learning Rate、Optimizer、Data Augmentation、Dropout |
| Day25~Day29 | Confusion Matrix、Error Analysis、CNN Architecture、Transfer Learning、模型調校整理 |
一開始,我們只是從 HAM10000 中拿出一張圖片,觀察它的尺寸、Pixel 和 RGB 數值。
後來開始建立模型,才發現圖片不只是要能讀取,還需要考慮資料切分、類別不平衡,以及不同模型適合的前處理方式。
到了後半段,我們開始不斷修改模型,觀察每一次調整帶來的影響。
在 Day15,我們第一次建立完整的 CNN Baseline Model,當時的 Test Accuracy 約為 73.49%。
接下來透過不同實驗,觀察各種方法是否能改善模型表現。
| 實驗 | 主要發現 |
|---|---|
| Learning Rate | 不是越大越好,0.001 在當次比較中表現較好 |
| Optimizer | Adam 在相同設定下比 SGD 更適合這次實驗 |
| Data Augmentation | 加入適當影像變化後,Test Accuracy 小幅提升 |
| Dropout | 降低 Training 和 Validation 之間的落差,Test Loss 也有所改善 |
| CNN Architecture | 增加 Layer 後 Accuracy 略有提升,但 Loss 不一定同步改善 |
| Transfer Learning | MobileNetV2 在這次實驗中優於原本的 CNN |
最後使用 MobileNetV2 進行 Feature Extraction,再進一步 Fine-tuning,取得這次系列中最高的 Test Accuracy:
78.58%
和最初的 Baseline 約 73.49% 相比,提升了約 5.09 個百分點。
不過,這些結果來自不同天的實驗,訓練過程也可能受到隨機初始化、模型架構和輸入尺寸等因素影響,因此不能將它們視為完全相同條件下的嚴格比較。
這 30 天讓我發現,很多原本以為「應該會更好」的調整,實際結果不一定符合預期。
例如 Learning Rate 並不是設得越大,模型就學得越快、越好。當 Learning Rate 設為 0.01 時,反而比 0.001 得到更差的 Test Accuracy。
而 CNN 也不是 Layer 越多就一定越強。
在 Day27 中,3-Layer CNN 的 Accuracy 雖然略高於 2-Layer CNN,但 Test Loss 並沒有跟著下降。
相較之下,Data Augmentation 和 Dropout 在各自的實驗中,都帶來了小幅改善。
但這不代表它們對所有模型或資料都有效。
這讓我學到:
模型調校沒有一組永遠最好的參數,重要的是知道自己為什麼要調整,以及如何驗證調整是否有效。
如果要選出這次最讓我印象深刻的部分,我會選 Day25 的 Confusion Matrix 和 Day26 的 Error Analysis。
因為在這之前,我們一直透過 Accuracy 和 Loss 觀察模型表現。
但當我們真正把 Confusion Matrix 畫出來後,才發現模型對不同類別的辨識能力差異非常大。
例如當時的 Dropout CNN:
nv 996 張中,957 張預測正確
mel 187 張中,只有 24 張預測正確
df 7 張中,沒有任何一張預測正確
更值得注意的是,133 張真正的 mel 被模型預測成 nv。
這代表即使整體 Accuracy 達到約 74%,模型仍然可能對某些類別有很大的辨識問題。
後來我們把預測錯誤的圖片實際找出來,觀察病灶的顏色、大小與邊界,也發現不同類別之間可能存在外觀相似的情況。
雖然不能只靠幾張圖片就判斷模型為什麼出錯,但這些錯誤案例至少讓我們知道,下一步可以從哪些方向繼續研究。
這次使用的 HAM10000 是皮膚病灶影像資料集,但我們建立的模型仍然只是學習與實驗用途,不能直接用來進行臨床診斷。
因為醫學 AI 面對的問題,比一般圖片分類更複雜。
例如:
1. Class Imbalance
不同疾病類別的圖片數量可能差很多,模型容易偏向資料量較多的類別。
2. 錯誤的代價不同
在醫學影像分類中,把某些需要進一步檢查的病灶判斷成其他類別,可能帶來較大的風險。
因此除了 Accuracy,也需要關注各類別的 Recall、Precision,以及不同錯誤可能造成的影響。
3. 資料不一定能代表真實環境
HAM10000 的圖片有特定的資料來源與拍攝條件,不能保證模型面對其他醫院、設備或不同族群的影像時,仍然能維持相同表現。
4. 模型預測不等於醫療診斷
即使模型能輸出七種類別的預測機率,也不代表它已經具備臨床診斷能力。
因此,真正要將醫學 AI 應用到醫療場域,還需要更完整的外部驗證、臨床評估,以及醫療專業人員的參與。
雖然這次完成了 30 天的學習與實驗,但目前的模型還有很多可以改進的地方。
首先,我想更深入處理 Class Imbalance。
前面的 Confusion Matrix 已經發現,模型對 nv 的辨識能力很好,但對 mel 等類別的表現仍然不足。
未來可以進一步比較 Class Weight、Oversampling 或其他方法,觀察是否能改善少數類別的 Recall。
另外,我也想嘗試更完整的醫學影像分析方法。
例如,先使用 Image Segmentation 找出病灶區域,再將病灶區域交給分類模型,實際比較這樣的處理方式是否能改善分類表現。
不過 Segmentation 並不保證一定有效,仍然需要考慮分割品質,以及是否會在裁切過程中失去重要的影像資訊。
最後,我也希望進一步了解模型到底根據圖片中的哪些區域做出判斷,例如使用 Grad-CAM 等方法觀察模型關注的位置。
這些都是未來值得繼續學習與實驗的方向。
如果說這 30 天最大的改變,我覺得不是學會了多少種模型,也不是最後把 Accuracy 提升到多少。
而是開始知道,當模型結果不理想時,不能只是不斷修改參數、重新執行程式。
從一開始只想讓模型順利執行,到現在會試著分析模型為什麼出錯、哪些方法值得嘗試,我覺得這就是這次鐵人賽最大的收穫。
我還不能說自己已經非常了解 AI,但至少比 30 天前,更清楚自己還有哪些地方需要學習。
這次選擇醫學影像作為主題,是因為自己本來就對醫療 AI 和影像分析很有興趣,也希望透過實際操作,更深入了解模型建立與調整的過程。
30 天的內容從 Pixel、RGB 開始,一路走到 CNN、模型調校和 Transfer Learning。
過程中有些實驗結果符合預期,也有些結果讓我發現原本的想法並不完全正確。
但我覺得這正是實作最有價值的地方。
學會執行模型是一個開始,學會分析結果、發現問題,再思考如何改善,才是我希望繼續培養的能力。
這 30 天的鐵人賽就到這裡告一段落。
謝謝看到最後的大家!