↑↑↑关注后"星标"Datawhale

每日干货 & 每月组队学习,不错过

Datawhale推荐

作者: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大佬的书,写的很接地气,建议新手们都看看。

“干货学习,点赞三连

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

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

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

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

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达推荐阅读 42个pycharm使用技巧,瞬间从黑铁变王者Google ...

  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. TensorFlow基本使用
  2. Post with HttpClient
  3. Leetcode46全排列DFS
  4. Softmax算法:逻辑回归的扩展
  5. ML:从0到1 机器学习算法思路实现全部过程最强攻略
  6. (转)完美画质 3D游戏反锯齿技术浅析 .
  7. PLSQL安装教程,无需oracle客户端(解决本地需要安装oracle客户端的烦恼)
  8. 用户界面的一些好的设计理念
  9. 即时通讯开发----回音消除技术
  10. android的应用组件,跟我学android-Android应用基本组件介绍(五)
  11. Spark 1.0.1源码安装
  12. SAP License:SAP中现金管理实现
  13. 静态代码块 构造代码块 构造方法的执行顺序
  14. python导入datetime模块_Python时间模块datetime用法
  15. 基于Python实现语义分析
  16. 【预测模型】基于BP神经网络预测股票matlab代码
  17. 图解《金字塔原理》,7步掌握其精华!
  18. 统计学名词解释 —— 3. 「简单随机样本」、「联合分布」与「联合密度」
  19. 特征码的使用办法_徐涛高频问题回答,刘晓艳阅读做题方法,汤家凤10套卷使用方法...
  20. 软件工程__CMMCMMI

热门文章

  1. modelsim中一个神奇又容易忽视的问题
  2. 【2007-5】【素数算式】
  3. MFC中的字符串转换
  4. 我翻译的一篇文章,OO设计中对象的创建和使用
  5. 【青少年编程(第33周)】Scratch(三级)公益活动开营了!
  6. getRotationMatrix2D 函数
  7. IDEA中提示:Warning:java: 源值1.5已过时, 将在未来所有发行版中删除
  8. 可租赁、可定制的虚拟人居然还能这么玩?9月25日来百度大脑人像特效专场一探究竟!...
  9. 全球Python调查报告:Python 2正在消亡,PyCharm比VS Code更受欢迎
  10. 七个开发者成就百亿市值公司?这个技术思路如今让阿里发扬光大