点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达推荐阅读
42个pycharm使用技巧,瞬间从黑铁变王者Google C++项目编程风格指南 (中文版) 分享

作者 | yishun@知乎

来源丨https://zhuanlan.zhihu.com/p/53683453

转自 | 极市平台

导读

对神经网络进行可视化分析不管是在学习上还是实际应用上都有很重要的意义,基于此,本文介绍了3种CNN的可视化方法:可视化中间特征图,可视化卷积核,可视化图像中类激活的热力图。每种方法均附有相关代码详解。

注:本文所有资料均来自Keras之父、Google人工智能研究员Francois Chollet的大作:《Python深度学习》,建议大家直接去看原文,这里只是结合楼主的理解做点笔记。

引言

有一些同学认为深度学习、神经网络什么的就是一个黑盒子,没办法、也不需要分析其内部的工作方式。个人认为这种说法“谬之千里”。

首先,站在自动特征提取或表示学习的角度来看,深度学习还是很好理解,即通过一个层级结构,由简单到复杂逐步提取特征,获得易于处理的高层次抽象表示。其次,现在也已经有很多方法对神经网络进行分析了,特别是一些可视化方法,可以很直观的展示深度模型的特征提取过程。

对神经网络进行可视化分析不管是在学习上还是实际应用上都有很重要的意义,基于此,本文将介绍以下3种CNN的可视化方法:

  1. 可视化中间特征图。

  2. 可视化卷积核。

  3. 可视化图像中类激活的热力图。

可视化中间特征图

这种方法很简单,把网络中间某层的输出的特征图按通道作为图片进行可视化展示即可,如下述代码所示:

import matplotlib.pyplot as plt
#get feature map of layer_activation
plt.matshow(layer_activation[0, :, :, 4], cmap='viridis')

把多个特征图可视化后堆叠在一起可以得到与下述类似的图片。

上图为某CNN 5-8 层输出的某喵星人的特征图的可视化结果(一个卷积核对应一个小图片)。可以发现越是低的层,捕捉的底层次像素信息越多,特征图中猫的轮廓也越清晰。越到高层,图像越抽象,稀疏程度也越高。这符合我们一直强调的特征提取概念。

可视化卷积核

想要观察卷积神经网络学到的过滤器,一种简单的方法是获取每个过滤器所响应的视觉模式。我们可以将其视为一个优化问题,即从空白输入图像开始,将梯度上升应用于卷积神经网络的输入图像,让某个过滤器的响应最大化,最后得到的图像是选定过滤器具有较大响应的图像。

核心代码如下所示(利用Keras框架):

def generate_pattern(layer_name, filter_index, size=150):layer_output = model.get_layer(layer_name).outputloss = K.mean(layer_output[:, :, :, filter_index])grads = K.gradients(loss, model.input)[0]grads /= (K.sqrt(K.mean(K.square(grads))) + 1e-5)iterate = K.function([model.input], [loss, grads])input_img_data = np.random.random((1, size, size, 3)) * 20 + 128.step = 1.for i in range(40):loss_value, grads_value = iterate([input_img_data])input_img_data += grads_value * stepimg = input_img_data[0]return deprocess_image(img)

将输入图片张量转换回图片后进行可视化,可以得到与下述类似的图片:

block1_conv1 层的过滤器模式

block2_conv1 层的过滤器模式

block3_conv1 层的过滤器模式

block4_conv1 层的过滤器模式

随着层数的加深,卷积神经网络中的过滤器变得越来越复杂,越来越精细。模型第一层( block1_conv1 )的过滤器对应简单的方向边缘和颜色,高层的过滤器类似于自然图像中的纹理:羽毛、眼睛、树叶等。

可视化图像中类激活的热力图

即显示原始图片的不同区域对某个CNN输出类别的“贡献”程度,如下面图片所示:

可以看到,大象头部对“大象”这个类别的“贡献”程度较高,而且这种方法似乎可以在一定程度上进行无监督的目标检测。

下面是书中原文,可能有点绕口。

我们将使用的具体实现方式是“Grad-CAM: visual explanations from deep networks via gradient-based localization”这篇论文中描述的方法。这种方法非常简单:给定一张输入图像,对于一个卷积层的输出特征图,用类别相对于通道的梯度对这个特征图中的每个通道进行加权。直观上来看,理解这个技巧的一种方法是,你是用“每个通道对类别的重要程度”对“输入图像对不同通道的激活强度”的空间图进行加权,从而得到了“输入图像对类别的激活强度”的空间图。

这里谈一下我的理解,给定线性函数  ,y为类别,  等等为输入。可以看到这里  对y的贡献为  ,恰好为  。当然了,深度模型中有非线性激活函数,不能简化为一个线性模型,所以这只是启发性的理解。

代码如下所示:

african_elephant_output = model.output[:, 386]
last_conv_layer = model.get_layer('block5_conv3')
grads = K.gradients(african_elephant_output, last_conv_layer.output)[0]
pooled_grads = K.mean(grads, axis=(0, 1, 2))
iterate = K.function([model.input],[pooled_grads, last_conv_layer.output[0]])
pooled_grads_value, conv_layer_output_value = iterate([x])
for i in range(512):conv_layer_output_value[:, :, i] *= pooled_grads_value[i]
heatmap = np.mean(conv_layer_output_value, axis=-1)
heatmap = np.maximum(heatmap, 0)
heatmap /= np.max(heatmap)
plt.matshow(heatmap)

得到的热力图如下所示:

经下述代码处理后,可以得到本节开始时的图片。

import cv2
img = cv2.imread(img_path)
heatmap = cv2.resize(heatmap, (img.shape[1], img.shape[0]))
heatmap = np.uint8(255 * heatmap)
heatmap = cv2.applyColorMap(heatmap, cv2.COLORMAP_JET)
superimposed_img = heatmap * 0.4 + img
cv2.imwrite('/Users/fchollet/Downloads/elephant_cam.jpg', superimposed_img)

结语

本文到这里就结束了,这里再次推荐一下Francois Chollet大佬的书,写的很接地气,建议新手们都看看。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目31讲

在「小白学视觉」公众号后台回复:Python视觉实战项目31讲即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

下载4:leetcode算法开源书

在「小白学视觉」公众号后台回复:leetcode即可下载。每题都 runtime beats 100% 的开源好书,你值得拥有!


交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

CNN 的一些可视化方法!相关推荐

  1. CNN的一些可视化方法!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale推荐 作者:yishun@知乎,编辑:极市平台 来源丨https://zhua ...

  2. 收藏 | CNN的一些可视化方法!

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 导读 对神经网络进行可视化分析不管是在学习上还是实际应用上都有很重 ...

  3. CNN 的一些可视化方法

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者 | yishun@知乎 来源丨https://zhuanlan.zhihu.com/p/5368 ...

  4. 深度 | 谷歌的新CNN特征可视化方法,构造出一个华丽繁复的新世界

    作者:晓凡 概要:近日,来自谷歌大脑和谷歌研究院的一篇技术文章又从一个新的角度拓展了人类对神经网络的理解,得到的可视化结果也非常亮眼.非常魔性. 深度神经网络解释性不好的问题一直是所有研究人员和商业应 ...

  5. 白盒-CNN纹理深度可视化: 使用MIT Place 场景预训练模型

    MIT发文:深度视觉的量化表示................ Places2 是一个场景图像数据集,包含 1千万张 图片,400多个不同类型的场景环境,可用于以场景和环境为应用内容的视觉认知任务. ...

  6. mlp 参数调优_积神经网络(CNN)的参数优化方法

    积神经网络(CNN)的参数优化方法 from:http://blog.csdn.net/u010900574/article/details/51992156 著名: 本文是从 Michael Nie ...

  7. 本周AI热点回顾:动森首届「AI 顶会」即将召开、《我的世界》里搭建神经网络、一位中国博士把整个CNN都给可视化了

    01 重要通知:动物森友会首届「AI 顶会」ACAI 2020即将召开 众所周知,因为疫情的原因,ICML.ICLR.CVPR 等人工智能顶级会议都已经改为了线上举办. 自从 AAAI 2020 之后 ...

  8. linux valgrind memCheck ---内存检查工具的可视化方法valkyrie

    linux valgrind memCheck -内存检查工具的可视化方法valkyrie linux valgrind Memcheck–内存检查工具 1.安装valgrind valgrind 安 ...

  9. Callgrind--函数调用分析工具以及可视化方法

    生成分析文件 命令行运行: valgrind --tool=callgrind ./palmGateMachine 检测完毕之后会生成一个文件callgrind.out.26805, 后面的数字其实是 ...

最新文章

  1. LeetCode Minimum Height Trees(拓扑排序)
  2. HTTP MIME type
  3. 一个没有收到任何Offer的应届生回想
  4. 算法学习经典例题整理
  5. 炸金花比牌规则java_陈陈来给你们炸金花的简易纸牌规则教学与心态指导
  6. python3多进程写时拷贝_python多进程实现复制文件
  7. Qt QMYSQL driver not loaded 解决办法
  8. 全国计算机二级ms2017,2017全国计算机二级MS-Office选择题题库大全
  9. 计算机装配调试员培训内容.doc,电子计算机(微机)装配调试员文档.doc
  10. [转载] Java并发编程:Callable、Future和FutureTask
  11. Linux jar包 后台运行
  12. 仿iOS Segmented Control样式
  13. PID算法之模糊PID
  14. 开源又好用的录屏软件
  15. EditPlus 编程背景色设置与代码高亮
  16. 运筹学修炼日记:TSP中两种不同消除子环路的方法及callback实现(Python调用Gurobi求解,附以王者荣耀视角解读callback的工作逻辑)
  17. 家庭作业(贪心 + 并查集)
  18. 计算机竞赛 自主招生,2017年自主招生认可的竞赛汇总
  19. Java 8计算两个日期之间的月份
  20. mysql修改游戏元宝_页游源码【武斗乾坤】自带安装启动教程+元宝游戏数据修改教程+自由一键游戏启动服务端...

热门文章

  1. 百度15篇论文被AAAI 2019收录
  2. 百度研究院再升级,迎来9位世界级科学家
  3. 立志打破日企垄断,ISP要被取代了吗?
  4. 领跑交互新时代 蓦然认知助力传统产业智能化升级
  5. AI一分钟 | 阿里NLP技术连破两项世界纪录,玉泉一号AI试验卫星明年发射
  6. 读 MySQL 源码再看 INSERT 加锁流程
  7. 公司终于决定放弃微服务传统设计模式,全面拥抱 DDD!
  8. Java这个高级特性-泛型,很多人还没用过!
  9. MySql 之 left join 避坑指南
  10. 图解 MySQL 索引:B-树、B+树