最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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");

イメージのサイズを変更して GoogLeNet の次元にします。

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 [convMap,dScoresdMap] = gradcam(dlnet, dlImg, softmaxName, convLayerName, classfn)
[scores,convMap] = predict(dlnet, dlImg, 'Outputs', {softmaxName, convLayerName});
classScore = scores(classfn);
dScoresdMap = dlgradient(classScore,convMap);
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);

ソフトマックス層の名前 'prob' を指定します。最終畳み込み層の名前 'inception_5b-output' を指定します。

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

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

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

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

[convMap, dScoresdMap] = dlfeval(@gradcam, dlnet, dlImg, softmaxName, convLayerName, classfn);

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

gradcamMap = sum(convMap .* 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.

参考

| | |

関連するトピック