4.7 Grad-CAM 模型視覺化
影像分類模型給出預測類別後,我們通常還想知道模型是根據圖片哪一個區域做判斷。Grad-CAM 可以把 CNN 最後一層卷積特徵與目標類別梯度結合,產生一張熱區圖,幫助我們檢查模型是否看到了合理位置。
1. 學習目標
本篇聚焦 CNN 預測結果的可檢查性。Accuracy 告訴我們模型答對多少,但 Grad-CAM 可以進一步觀察模型答題時大致關注哪裡。若模型預測正確但熱區集中在背景,代表它可能學到錯誤線索。
2. 範例資料
Notebook 使用和 4.6 相同概念的方向圖形資料集,包含 vertical、horizontal、diagonal 三類圖片。這份資料的好處是影像中真正有用的區域很直觀,因此很適合用來示範 Grad-CAM 熱區是否落在線條附近。
3. Grad-CAM 的直覺
Grad-CAM 的流程可以簡化成三步:
- 找到 CNN 中最後一個卷積層的 feature maps。
- 計算目標類別分數對 feature maps 的梯度。
- 用梯度當作權重,把 feature maps 加權合成 heatmap。
熱區越亮,代表該區域對目前類別分數的影響越大。
4. 實作流程
Notebook 會先訓練一個小型 CNN,並將最後一層卷積層命名為 last_conv。接著建立 Grad-CAM 函式,對單張測試圖片產生 heatmap,最後把 heatmap 疊回原圖,觀察模型關注區域。
5. 如何套用自己的模型?
套用 Grad-CAM 時,需要確認三件事:
- 模型中要有卷積層,且能指定最後一個適合視覺化的卷積層名稱。
- 輸入圖片前處理必須和模型訓練時一致。
- 若模型最後輸出是 softmax 機率,也可以先用目前預測類別做視覺化;若要更嚴謹,可針對 logits 版本計算梯度。
若使用 MobileNetV2、ResNet 或 EfficientNet,可以先用 model.summary() 找到後段卷積層名稱,再把本篇的 last_conv_layer_name 換成該層。
6. 什麼時候要看 Grad-CAM?
Grad-CAM 適合用在模型診斷與溝通,例如:
- 檢查分類模型是否關注到物體本身,而不是背景或浮水印。
- 分析錯誤案例,看模型是否被相似紋理或局部區域誤導。
- 在醫療影像、瑕疵檢測或品質檢查中,輔助確認模型判斷線索是否合理。
Grad-CAM 不是完整解釋,也不能取代模型評估。它是診斷工具,應該搭配 confusion matrix、錯誤案例與資料檢查一起使用。
7. 小結
Grad-CAM 讓 CNN 的預測不只是一個類別機率,而能多一層視覺檢查。當模型看對位置時,結果比較容易被理解;當模型看錯位置時,通常也能回頭修正資料、標註或訓練流程。