Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

Grad-CAM での深層学習による判定の理由の解明

この例では、勾配加重クラス活性化マッピング (Grad-CAM) 手法を使用して、深層学習ネットワークによってその分類の判定が行われた理由を理解する方法を説明します。Selvaraju と共著者 [1] によって考案された Grad-CAM では、ネットワークにより決定する畳み込みの特徴についての分類スコアの勾配を使用して、イメージのどの部分が分類に最も重要であるかを理解します。この例では、イメージに GoogLeNet の事前学習済みのネットワークを使用します。

Grad-CAM は、クラス活性化マッピング (CAM) 手法を一般化したものです。この例では、Grad-CAM で自動微分関数 dlgradient を使用して必要な計算を簡単に実行する方法を示します。ライブ Web カメラのデータへの活性化マッピング手法の使用については、クラス活性化マッピングを使用したネットワークの予測の調査を参照してください。

事前学習済みのネットワークの読み込み

GoogLeNet ネットワークを読み込みます。

net = googlenet;

イメージの分類

GoogLeNet イメージのサイズを読み取ります。

inputSize = net.Layers(1).InputSize(1:2);

この例に含まれるゴールデン レトリバーのイメージ sherlock.jpg を読み込みます。

img = imread("sherlock.jpg");

イメージのサイズをネットワークの入力次元に変更します。

img = imresize(img,inputSize);

イメージを分類し、分類および分類スコアと一緒に表示します。

[classfn,score] = classify(net,img);
imshow(img);
title(sprintf("%s (%.2f)", classfn, score(classfn)));

GoogLeNet はイメージをゴールデン レトリバーとして正しく分類します。それはなぜでしょうか。イメージのどの特性によって、ネットワークがこの分類を行うのでしょうか。

Grad-CAM での理由の解明

Grad-CAM [1] の背景にあるのは、最終の畳み込みの特徴マッピングについて最終的な分類スコアの勾配を計算するという概念です。この勾配が大きくなる場所は、最終的なスコアがデータに最も依存する場所を示します。補助関数 gradcam は、畳み込み特徴マップに対する任意のクラスのソフトマックス層スコアの微分を取得して、dlnetwork の Grad-CAM マップを計算します。自動微分の場合、入力イメージ dlImgdlarray でなければなりません。

type gradcam.m
function [featureMap,dScoresdMap] = gradcam(dlnet, dlImg, softmaxName, featureLayerName, classfn)
[scores,featureMap] = predict(dlnet, dlImg, 'Outputs', {softmaxName, featureLayerName});
classScore = scores(classfn);
dScoresdMap = dlgradient(classScore,featureMap);
end

関数 gradcam の 1 行目は、ネットワークからクラス スコアと特徴マップを取得します。2 行目は、選択した分類 (この場合はゴールデン レトリバー) のスコアを求めます。dlgradient は、スカラー値関数についてのみ勾配を計算します。そのため、gradcam は、選択した分類についてのみイメージ スコアの勾配を計算します。3 行目では、自動微分を使用して、特徴マッピング層の重みについて最終的なスコアの勾配を計算します。

Grad-CAM を使用するには、GoogLeNet ネットワークから dlnetwork を作成します。まず、ネットワークから層グラフを作成します。

lgraph = layerGraph(net);

GoogLeNet で分類に使用されるデータにアクセスするため、その最終分類層を削除します。

lgraph = removeLayers(lgraph, lgraph.Layers(end).Name);

層グラフから dlnetwork を作成します。

dlnet = dlnetwork(lgraph);

Grad-CAM 補助関数で使用する、ソフトマックス層と特徴マップ層の名前を指定します。特徴マップ層には、非単集合の空間次元をもつ最後の ReLU 層、または ReLU 層の出力を集める最後の層 (深さ連結層や加算層など) を指定します。ネットワークに ReLU 層が含まれない場合は、非単集合の空間次元を出力にもつ最終畳み込み層の名前を指定します。関数 analyzeNetwork を使用してネットワークを検査し、正しい層を選択します。GoogLeNet の場合、ソフトマックス層の名前は 'prob'、深さ連結層の名前は 'inception_5b-output' です。

softmaxName = 'prob';
featureLayerName = 'inception_5b-output';

自動微分を使用するには、sherlock のイメージを dlarray に変換します。

dlImg = dlarray(single(img),'SSC');

関数 gradcamdlfeval を呼び出すことによって、イメージの Grad-CAM 勾配を計算します。

[featureMap, dScoresdMap] = dlfeval(@gradcam, dlnet, dlImg, softmaxName, featureLayerName, classfn);

GoogLeNet イメージ サイズへの勾配マップのサイズを変更し、スコアを表示に適したレベルにスケーリングします。

gradcamMap = sum(featureMap .* sum(dScoresdMap, [1 2]), 3);
gradcamMap = extractdata(gradcamMap);
gradcamMap = rescale(gradcamMap);
gradcamMap = imresize(gradcamMap, inputSize, 'Method', 'bicubic');

'AlphaData' の値として 0.5 を使用して、イメージの上に Grad-CAM レベルを表示します。'jet' カラーマップでは、濃い青が最低値、濃い赤が最高値になっています。

imshow(img);
hold on;
imagesc(gradcamMap,'AlphaData',0.5);
colormap jet
hold off;
title("Grad-CAM");

明らかに、犬の顔の上側と耳が分類に最も大きく影響しています。

深層ネットワークによる分類の理由を調べる別の方法については、occlusionSensitivityを参照してください。

参考文献

[1] Selvaraju, R. R., M. Cogswell, A. Das, R. Vedantam, D. Parikh, and D. Batra. "Grad-CAM: Visual Explanations from Deep Networks via Gradient-Based Localization." In IEEE International Conference on Computer Vision (ICCV), 2017, pp. 618–626. Available at Grad-CAM on the Computer Vision Foundation Open Access website.

参考

| | |

関連するトピック