0
点赞
收藏
分享

微信扫一扫

使用GradCam解密卷积神经网络


文章目录

  • ​​概述​​
  • ​​方法​​
  • ​​实现过程​​
  • ​​结论​​

概述

卷积神经网络(CNNs)和其他深度学习网络在各种计算机视觉任务中实现了前所未有的突破,从图像分类到目标检测、语义分割、图像字幕,以及最近的视觉问题回答。虽然这些网络具有优越的性能,但它们缺乏可分解为直观和可理解的组件的能力,因此很难解释它们。因此,当今天的智能系统出现故障时,它们会在没有警告或解释的情况下异常地失败,让用户盯着不连贯的输出,想知道为什么。

深度学习模型的可解释性对于建立信任以及将其成功融入我们的日常生活至关重要。为了实现这一目标,模型透明性对于解释他们为什么预测他们所预测的东西是很有用的。

广义地说,这种透明度在人工智能(AI)进化的三个阶段是有用的。

  • 首先,当人工智能相对较弱,还不能可靠地“部署”时,透明和解释的目标是识别失败模式。
  • 其次,当人工智能与人类相当,并可靠地“可部署”时,目标是在用户中建立适当的信任和信心。
  • 第三,当人工智能比人类强大得多时,解释的目标就在于机器教学,即教会人类如何做出更好的决定。

在前一篇​​文章​​中,我们讨论了卷积神经网络中的可解释性问题,并讨论了一种非常流行的技术,即类激活映射(Class Activation Map)或CAM,在一定程度上用于解决这个问题。尽管CAM是一种很好的技术,可以揭开CNN工作的神秘面纱,并在开发的应用程序中建立客户的信任,但它们受到一些限制。CAM的缺点之一是它要求特征映射直接位于softmax层之前,因此它适用于一种特定的CNN架构,即在预测之前立即在卷积映射上执行全局平均池。(即conv feature maps global average pooling softmax layer)。这种架构在某些任务上可能比一般网络的精度差,或者根本不适用于新任务。

在这篇文章中,我们将讨论CAM的一种概括,即所谓的梯度CAM。《grad-cam》于2017年出版,旨在改进CAM的缺点,并声称可以兼容任何类型的架构。该技术不需要对现有的模型架构进行任何修改,这允许它适用于任何基于CNN的架构,包括用于图像字幕和视觉问题回答的架构。对于全卷积架构,grad-cam减少到CAM。

方法

先前的几项研究都断言,CNN中更深层次的表现捕获了最好的高层结构。此外,CNN自然会对在全连接层中丢失的空间信息进行再训练,所以我们可以期望最后的卷积层在高级语义和详细的空间信息之间有最好的权衡。

gradcam不同于CAM,它利用流入CNN最后卷积层的梯度信息来理解每个神经元,从而做出感兴趣的决定。为了得到任意c类的宽度u、高度v的类判别定位图,我们首先计算c类yc (softmax之前)对于卷积层的特征图Ak的评分梯度。这些回流的梯度是全局平均池,以获得目标类神经元的重要权重ak。

使用GradCam解密卷积神经网络_卷积神经网络
在计算目标类c的ak后,我们执行一个加权激活映射组合,并遵循它的ReLU。
使用GradCam解密卷积神经网络_卷积_02
这将产生与卷积特征图相同大小的粗糙热图。我们将ReLU应用于线性组合,因为我们只对对感兴趣的类有积极影响的特征感兴趣。如果没有ReLU,类激活映射会强调更多的内容,从而实现较低的定位性能。

下图显示了每个计算机视觉任务的完整流程,以便更清楚地了解这个重要概念。
使用GradCam解密卷积神经网络_卷积神经网络_03

实现过程

  1. 首先,我们需要一个模型来运行前向运算。我们在Imagenet上使用预先训练过的VGG16。您可以使用任何模型,因为GradCam不像CAM那样需要特定的体系结构,并且与任何卷积神经网络兼容。
model = VGG16(weights='imagenet')
  1. 在定义模型之后,我们加载一个样本图像并对其进行预处理,使其与模型兼容。
def preprocess(img):
img = img_to_array(img)
img = np.expand_dims(img,axis=0)
img = preprocess_input(img)
return img
image_1 = preprocess(image)

使用GradCam解密卷积神经网络_卷积_04

  1. 然后利用该模型对样本图像进行预测,并对前三种预测进行解码。正如你在下面的图片中所看到的,我们只是考虑模型的前三个预测,最顶级的模型预测是boxer。
predict = model.predict(image_1)
print(decode_predictions(predict,top=3))
target_class = np.argmax(predict[0])
print("Target Class = %d"%target_class)

使用GradCam解密卷积神经网络_人工智能_05

  1. 下一步,我们找到目标类评分yc相对于最后一个卷积层的特征映射Ak的梯度。它直观地告诉我们每个通道对于目标类的重要性。变量梯度返回一个张量,将在接下来的步骤中使用。
last_conv = model.get_layer('block5_conv3')
grads = K.gradients(model.output[:,242],last_conv.output)[0]
  1. 然后将得到的梯度进行全局平均池,得到与目标类对应的神经元重要权重ak,如图1所示。这将返回一个张量,该张量被传递给Keras函数,该函数将图像作为输入,并返回pooled_gradient以及来自最后一个卷积层的激活映射。
pooled_grads = K.mean(grads,axis=(0,1,2))
iterate = K.function([model.input],[pooled_grads,last_conv.output[0]])
pooled_grads_value,conv_layer_output = iterate([image_1])
  1. 之后,我们将每个激活映射与相应的混合梯度相乘,这些梯度作为权重,决定每个通道对于目标类的重要性。然后取通道上所有激活映射的均值,得到最终的类判别显著映射。
for i in range(512):
conv_layer_output[:,:,i] *= pooled_grads_value[i]
heatmap = np.mean(conv_layer_output,axis=-1)

使用GradCam解密卷积神经网络_卷积_06

  1. 然后我们对生成的热图应用ReLU,以便只保留对输出热图有积极影响的特征。但是我们看到在热图中没有很多负强度,因此在应用ReLU后热图中没有太多变化。
for x in range(heatmap.shape[0]):
for y in range(heatmap.shape[1]):
heatmap[x,y] = np.max(heatmap[x,y],0)

使用GradCam解密卷积神经网络_卷积_07

  1. 然后我们将热图的每个强度值与最大强度值分开,以便标准化热图,使所有的值都在0到1之间。
heatmap = np.maximum(heatmap,0)
heatmap /= np.max(heatmap)
plt.imshow(heatmap)

使用GradCam解密卷积神经网络_卷积神经网络_08

  1. 最后,我们对得到的热图进行上采样,以匹配输入图像的尺寸,并将其覆盖在输入图像上以查看结果。
upsample = resize(heatmap, (224,224),preserve_range=True)
plt.imshow(image)
plt.imshow(upsample,alpha=0.5)
plt.show()

使用GradCam解密卷积神经网络_人工智能_09

结论

在这篇文章中,我们学习了一种解释卷积神经网络的新技术,卷积神经网络是一种最先进的架构,尤其适用于与图像相关的任务。Grad Cam改进了它的前身Cam,并提供了更好的定位和清晰的类区别显著图,引导我们揭开黑盒子样模型背后的复杂性。可解释机器学习领域的研究正在以更快的速度发展,对于建立客户信任和帮助改进模型是非常关键的。


举报

相关推荐

0 条评论