Grad-CAM 揭示深度学习决策背后的原因
R2026b此示例说明如何使用梯度加权类激活映射 (Grad-CAM) 技术来理解深度学习网络做出相应分类决策的原因。Grad-CAM 由 Selvaraju 及其合著者提出 [1],该技术利用分类得分相对于网络确定的卷积特征的梯度,来理解图像中哪些部分对分类最为重要。此示例使用适用于图像的 GoogLeNet 预训练网络。
Grad-CAM 是类激活映射 (CAM) 技术的推广。如需了解基于实时网络摄像头数据的激活映射技术,请参阅使用类激活映射调查网络预测。Grad-CAM 还可以应用于非分类示例,例如回归或语义分割。有关说明如何使用 Grad-CAM 来调查语义分割网络的预测的示例,请参阅Explore Semantic Segmentation Network Using Grad-CAM。
加载预训练网络
加载 GoogLeNet 网络。
[net,classNames] = imagePretrainedNetwork("googlenet");对图像进行分类
读取 GoogLeNet 图像大小。
inputSize = net.Layers(1).InputSize(1:2);
加载 sherlock.jpg,这是此示例中包含的一张金毛寻回犬图像。
img = imread("sherlock.jpg");将图像大小调整为网络输入尺寸。
img = imresize(img,inputSize);
对于单个观测值输入,请使用 predict 函数进行预测。要使用 GPU 进行预测,请先将数据转换为 gpuArray。在 GPU 上进行预测需要 Parallel Computing Toolbox™ 许可证和受支持的 GPU 设备。有关受支持设备的信息,请参阅GPU 计算要求 (Parallel Computing Toolbox)。
if canUseGPU X = gpuArray(img); end scores = predict(net,single(img)); Y = scores2label(scores,classNames); imshow(img); title(Y);

GoogLeNet 正确地将图像分类为金毛寻回犬。但背后原因是什么?图像中的哪些特征使网络做出了这一分类?
Grad-CAM 解释原因
Grad-CAM 技术利用分类得分相对于最终卷积特征图的梯度,来识别输入图像中对分类得分影响最大的部分。此梯度较大的位置就是最终得分对数据依赖程度最大的位置。
gradCAM 函数通过求给定类的归约层输出相对于卷积特征图的导数,来计算重要性图。对于分类任务,gradCAM 函数会自动选择合适的层来计算重要性图。您还可以使用 'ReductionLayer' 和 'FeatureLayer' 名称-值参量来指定层。
计算 Grad-CAM 图。
channel = find(Y == categorical(classNames)); map = gradCAM(net,img,channel);
通过使用 'AlphaData' 值 0.5,在图像上叠加显示 Grad-CAM 图。在 'jet' 颜色图中,最低值为深蓝色,最高值为深红色。
imshow(img); hold on; imagesc(map,'AlphaData',0.5); colormap jet hold off; title("Grad-CAM");

可以清楚地看出,狗的上脸部和耳朵对分类的影响最大。
有关调查深度网络分类原因的另一种方法,请参阅occlusionSensitivity和imageLIME。
参考资料
[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.该文献可在 Computer Vision Foundation Open Access 网站上的 Grad-CAM 下查阅。
另请参阅
gradCAM | imageLIME | occlusionSensitivity | deepDreamImage