可视化

  • CAM
  • Grad_CAM

最近在学习可解释性方面的内容,主要是用cam做可解释性,因此想要系统地学习一下。
参考:
keras CAM和Grad-cam原理简介与实现
GAP CAM Grad-CAM Grad-CAM++的解释
pytorch实现所有cam衍生
ECG-Grad-CAM

CAM

  1. 将原模型的结构修改:利用GAP(Global Average Pooling)替换掉了全连接层

  2. 重新进行训练

  3. 经过GAP之后,得到了最后一个卷积层每个特征图的均值,均值经过加权和得到输出某个类别的权重

  4. 对于一个特定的类c,最终的分类分数 Y c Y^c Yc可以写成它经过全局平均池化的最后一个卷积层特征映射 A k A^k Ak的线性组合

  5. 因此,CAM需要做的就是:
    找出某个类别每个特征图对应的权重,将特征图与权重进行加权和后叠加到原图就可以得到重点信息

CAM通过使用为给定图像生成的最后一个卷积层的激活映射,为每个c类训练一个线性分类器来估计这些权重 w c k w^k_c wck​。但这将其解释能力限制在具有GAP倒数层的CNN上,并且需要在初始模型训练后再训练多个线性分类器(每个类一个)。

求解heatmap流程图:

  1. 求出图像经过特征提取后得到的最后一层卷积的特征图
  2. 所有特征图在全连接分类的权重不一样,利用反向传播求出每张特征图的权重,CAM 方法要求模型必须使用GAP层,因为利用GAP层可以有更强的可解释性,GAP后每张特征图对应一个权重,选择softmax层值最大得到节点反向传播,将梯度作为权重
  3. 用每张特征图乘以权重得到带权重的特征图,在第三维求均值,relu激活,归一化处理(避免有些值不在0-255范围内)。其中最重要的是relu激活(relu只保留大于0的值),relu后只保留该类别有用的特征。正数认为是该类别有用的特征,负数是其他类别的特征(或无用特征)。如果没有relu,定位图谱显示的不仅仅是某一类的特征。而是所有类别的特征

缺点:

CAM要求修改原模型的结构,导致需要重新训练该模型,这大大限制了它的使用场景。

Grad_CAM

Grad-cam实现了不改变模型结构的求heatmap的方法。具体流程还是上述的流程,只是巧妙的求出来每张特征图的权重。
求解heatmap流程图:

  1. 求出图像经过特征提取后得到的最后一层卷积的特征图
  2. 所有特征图在全连接分类的权重不一样,利用反向传播求出每张特征图的权重,Grad-cam的思想是选择softmax值最大的节点(对应置信度最高的类别)反向传播,对最后一层卷积层求梯度,每张特征图的梯度的均值作为该张特征图的权重。
  3. 用每张特征图乘以权重得到带权重的特征图,在第三维求均值,relu激活,归一化处理(避免有些值不在0-255范围内)。

为了获得细粒度的像素尺度表示,Grad-CAM显著maps被上采样,并通过点乘与Guided Backpropagation生成的可视化结果融合。这种可视化被称为 Guided Grad-CAM

def explain(input, model, layer):#input为模型输入,model为原始模型以及参数,layer为最后一层卷积层grad_model = tf.keras.models.Model([model.inputs],[model.get_layer(layer).output,model.output])inputs = inputclass_idx = np.argmax(pred)#找出softmax值最大的节点with tf.GradientTape() as tape:conv_outputs, predictions = grad_model(inputs)#得到卷积层输出和最终输出loss = predictions[:, class_idx]grads = tape.gradient(loss, conv_outputs)#对最后一层卷积层求梯度guided_grads = (tf.cast(conv_outputs > 0, "float32") * tf.cast(grads > 0, "float32") * grads)#guided描边操作output = conv_outputs[0]guided_grad = guided_grads[0]weights = tf.reduce_mean(guided_grad, axis=(0, 1))#每张特征图的梯度的均值作为该张特征图的权重heatmap = tf.reduce_sum(tf.multiply(weights, output), axis=-1)#得到带权重的特征图,在第三维求均值image = np.uint8(inputs)image = np.squeeze(image)heatmap = cv2.resize(heatmap.numpy(), tuple([image.shape[1], image.shape[0]]))heatmap = np.maximum(heatmap, 0)#relu激活max_heat = np.max(heatmap)if max_heat == 0:max_heat = 1e-10heatmap /= max_heatheatmap = (heatmap - np.min(heatmap)) / (heatmap.max() - heatmap.min())#归一化return heatmap

缺点:
如果图像包含多个相同的类,Grad-CAM就不能正确地定位图像中的对象。这是一个严重的问题,因为在现实世界中,同一对象在图像中多次出现是非常常见的,但这个时候Grad_CAM无法很好定位

后面可以继续学习一下Grad_CAM++和Score_CAM

可解释性(一)之CAM和Grad_CAM相关推荐

  1. 【论文笔记】【2020TMM】Towards Imperceptible Adversarial Image Patches Based on Network Explanations

    个人总结: 本文与PS-GAN有些相似,但是前者是通约束与原图像距离生成对抗样本,后者基于GAN,约束与patch种子的距离生成,但是两篇文章中都引用了CAM的方法--Grad_CAM通过权重汇集,再 ...

  2. 可解释性神经网络(可视化):CAM/Grad-CAM pytorch相关代码

    目录 为什么神经网络要具有可解释性 前言 类激活图(CAM,class activation map),可视化 1.1 CAM的工作原理 2. 基于梯度的CAM(Grad-CAM) pytorch 实 ...

  3. 【学习打卡】CAM可解释性分析-算法讲解

    文章目录 引言 该算法能做什么 直观上 研究上 意义上 精妙之处 定位特点 弱监督学习特点 作者简介 CAM算法原理 具体计算方法 巧妙之处 讨论 全卷积神经网络 池化简介 池化的作用 全局平均池化 ...

  4. 机器学习可解释性(二) —— 类激活映射(CAM)

    # 机器学习可解释性(二)--类激活映射(CAM) 文章目录 1.序言 2.方法介绍 2.1 CAM 2.2 GradCAM 2.3 GradAM++ 2.4 LayerCAM 3.算法实现 3.1 ...

  5. 深度学习论文笔记(可解释性)——CAM与Grad-CAM

    文章目录 主要工作 Global Average Pooling的工作机制 CAM Grad-CAM 主要工作 CAM与Grad-CAM用于解释CNN模型,这两个算法均可得出classactivati ...

  6. CNN可视化技术 -- CAM Grad-CAM详解及pytorch简洁实现

    文章目录 前言 1. CAM(Class Activation Map) 2. Grad-CAM 3. PyTorch中的hook机制 4. Grad-CAM的PyTorch简洁实现 参考资料 前言 ...

  7. 卷积神经网络模型可解释性

    卷积神经网络模型可解释性 缺乏可解释性仍然是在许多应用中采用深层模型的一个关键障碍.在这项工作中,明确地调整了深层模型,这样人类用户可以在很短的时间内完成他们预测背后的过程.具体地说,训练了深度时间序 ...

  8. 图神经网络的解释性综述!

    ↑↑↑关注后"星标"Datawhale每日干货 & 每月组队学习,不错过Datawhale干货 来源:纪厚业,北京邮电大学,图与推荐 编辑:数据派THU本文约1.5w字,干 ...

  9. 可视化卷积神经网络的过滤器_万字长文:深度卷积神经网络特征可视化技术(CAM)最新综述...

    ↑ 点击蓝字 关注极市平台作者丨皮特潘@知乎来源丨https://zhuanlan.zhihu.com/p/269702192编辑丨极市平台 极市导读 本文通过引用七篇论文来论述CAM技术,对CAM的 ...

  10. 收藏 | 图神经网络的解释性综述

    来源:图与推荐本文约1.5w字,干货满满,建议收藏本文对近期提出的 GNN 解释技术进行了系统的总结和分析,归纳对比了该问题的解决思路. 图神经网络的可解释性是目前比较值得探索的方向,今天解读的202 ...

最新文章

  1. ASP.NET Web Pages – 页面布局简介
  2. 保Cloudera弃Hortonworks,新平台将支持五大云供应商
  3. JDBC访问数据库的基本程序
  4. 配置SQL Server 2005 远程连接(转)
  5. String.split()方法你可能不知道的一面
  6. C#集合类型总结和性能分析
  7. aixdb2安装手册_AIX下安装db2数据库步骤
  8. java文件虚拟路径_java虚拟路径的总结
  9. C语言的变量的作用域和生存期
  10. 主成分分析 与 因子分析
  11. nexus3.x批量上传jar包
  12. DAO 的具体内涵与概念
  13. xshell 批量创建.xsh会话文件
  14. 一加5应用未安装怎么解决_如何解决一加手机x安装不了软件下载的问题?
  15. 重装正版Windows系统
  16. 如果通过这次面试我们单位录用了你,但工作一段时间却发现你根本不适合这个职位,你怎么办?
  17. 华为--dis查看命令
  18. tensorflow框架精细讲解(一)
  19. Long Short Term Memory networks(LSTMs)
  20. 关于pycharm找不到已经安装的模块问题的解决方案module ImportError

热门文章

  1. java 进制转换 类库_java 进制转换 - 雨田ZERO的个人空间 - OSCHINA - 中文开源技术交流社区...
  2. 拓嘉辰丰电商:拼多多换季大促活动是什么
  3. C语言猴子选王链表实现
  4. 所见即所得: Adobe XD 的 Flutter 插件
  5. 286、无线AP和无线路由器有哪些不同?
  6. TAXII服务规范 对于威胁情报平台开发及协作具有相当的指导意义
  7. 可怜的神水 - 计蒜客
  8. 国内名校两万名留学生拒绝回国,国家终于出手了!
  9. 车联网仿真学习——OMNet++建立新工程并与INET和veins建立连接
  10. MOSFET击穿问题