対象読者:CNN の判断根拠を確認したい初学者~中級エンジニア
ゴール:わずか数行のコードで Grad‑CAM を動かし、誤判定解析や説明可能性(XAI)に役立てる。
1. Grad‑CAM とは?
Grad‑CAM(Gradient‑weighted Class Activation Mapping)は、画像分類モデルが どのピクセル領域に注目して予測したかをヒートマップで示す手法。医療画像診断や不良検出など、AI の“説明責任”が求められる場面で多用されます。
ヒートマップでは、赤い部分ほどモデルが強く注目した領域であり、青い部分はあまり関心がなかったことを示します。 以下は Grad-CAM の出力例です。

この例では、犬の顔や身体の中心が赤く強調されており、そこに注目して「犬」と判断していることがわかります。 背景は青く、判断にはほとんど使われていないこともわかります。
2. Google Colab で簡単実装
以下は Grad-CAM を Google Colaboratory 上で試すための完全なサンプルコードです。
!pip install git+https://github.com/jacobgil/pytorch-grad-cam.git
from google.colab import files
uploaded = files.upload()
import torch
from torchvision import models, transforms
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from pytorch_grad_cam import GradCAM
from pytorch_grad_cam.utils.image import show_cam_on_image
from pytorch_grad_cam.utils.model_targets import ClassifierOutputTarget
from torchvision.models import resnet50, ResNet50_Weights
# 画像の読み込みと前処理
url = "do2.jpeg" # アップロードするファイル名に修正してください。
img = Image.open(url).convert('RGB')
# 【前処理】モデルに入力できるサイズにリサイズし、テンソル化
preprocess = transforms.Compose([
transforms.Resize((224, 224)), # 入力サイズを固定
transforms.ToTensor() # PIL → Tensor に変換
])
input_tensor = preprocess(img).unsqueeze(0) # shape: (1, 3, 224, 224)
input_image = input_tensor.squeeze().permute(1, 2, 0).numpy()
input_image = input_image / input_image.max() # 正規化して0〜1にスケーリング
# モデル読み込み
model = resnet50(weights=ResNet50_Weights.IMAGENET1K_V1)
model.eval()
# GradCAM 実行
target_layers = [model.layer4[-1]]
cam = GradCAM(model=model, target_layers=target_layers)
targets = [ClassifierOutputTarget(281)] # 任意クラス(例: tabby cat)
grayscale_cam = cam(input_tensor=input_tensor, targets=targets)[0]
# ヒートマップ合成と表示
visualization = show_cam_on_image(input_image, grayscale_cam, use_rgb=True)
plt.imshow(visualization)
plt.axis('off')
plt.title("Grad-CAM Visualization")
plt.show()
3. 活用シーン
シナリオ | Grad‑CAM が役立つ理由 |
---|---|
誤分類の原因分析 | ヒートマップが“見当違い”ならデータやモデル構造を再検討 |
クライアント説明 | どこを見て判断したかを図示→信頼性アップ |
データセット検証 | ラベルミスや強いバイアスを早期発見 |
4. よくある落とし穴と対策
- 入力前処理をスキップ → ヒートマップ位置ズレ → モデルと同じ正規化・サイズ に合わせる。
- マルチラベルタスク →
targets
引数でクラス ID を明示する。 - 高解像度画像でボケる → 元画像をリサイズしてからヒートマップをアップサンプリング。
5. 類似・関連可視化手法
手法 | ひと言特徴 | どんなとき向く? |
CAM (Class Activation Mapping) | 勾配を使わず、GAP付き CNN の重みでヒートマップ | 古典的ResNet・GoogLeNet等で実装が簡単 |
Score‑CAM | 勾配を使わず、各チャネルの貢献度をスコアで測定 | 勾配がノイズ気味なモデルでも安定 |
Guided Backprop | 勾配の正方向のみ通過させ、特徴をピクセル単位で可視化 | エッジ・細部を確認したいとき |
Integrated Gradients | 入力画像の各ピクセルが予測に与えた影響を“積分”で可視化 | 白黒的な重要度マップが欲しいとき/勾配が不安定なとき |
SmoothGrad | 入力にノイズを加えながら勾配を平均→ノイズの少ないヒートマップに | ヒートマップがザラついてしまうときに滑らかに可視化したい |
LIME / SHAP | 画像をセグメントでマスク→出力変化を解析 | モデル非依存で“局所的”説明が可能 |
選び方のヒント:まずは Grad‑CAM でざっくり可視化 → 細部が気になれば Guided Backprop/Integrated Gradients、モデル非依存なら LIME/SHAP を試すと効率的です。
まとめ
Grad‑CAM はブラックボックスな CNN の“視線”を可視化する最も手軽な XAI ツールです。まずは ImageNet 学習済み ResNet で動かし、ヒートマップを観察するところから始めてみましょう。