写点什么

“看透”神经网络

  • 2019-09-07
  • 本文字数:3517 字

    阅读完需:约 12 分钟

“看透”神经网络

大家最诟病深度学习的一点就是理论基础不够系统,模型就像一个黑盒子,这就更加凸显了深度学习模型可视化的重要性了。

本文以实战经验为主,除去数据的可视化部分,我们说以下几个主要的方向(1)模型结构的可视化(2)卷积参数的可视化(3)激活区域的可视化(4)训练过程的可视化。

01

模型结构的可视化

所谓模型结构的可视化,就是为了方便更直观的看到模型的结构,从而方便进行调试,下面对 2 个主流的框架进行展示。

1.1 caffe 网络结构可视化

定义一个简单的 3 层的模型(模型可以查看我们 git,代码太长此处不展示),我们可以采用几种方案进行可视化;第一种,利用 caffe 自带的可视化方法;第二种,利用开源项目 netscope;由于 netscope 可视化效果更好,因此我们采用 netscope 进行可视化,工具网址如下:


相关链接:


http://ethereon.github.io/netscope/#/editor



可视化后的结果如上图,可以看到网络的结构是通过卷积+激活函数的堆叠,同时网络的数据输入层和最后的全连接层作为了 loss 层和 acc 层的输入。


当我们想要看每一层的参数时,就可以将鼠标放上相应的结构块;



当然,还可以使用 caffe 自带的脚本进行可视化,在 caffe 根目录下的 python 目录下有 draw_net.py 这个脚本。


draw_net.py 执行的时候带三个参数,第一个参数是网络模型的 prototxt 文件,第二个参数是保存的图片路径及名字,第三个参数是 rankdirx,他有四种选项,分别是 LR, RL, TB, BT。用来表示网络的方向,分别是从左到右,从右到左,从上到小,从下到上。默认为 LR。

1.2 tensorflow 网络结构可视化

在 tensorflow 中要进行可视化,必须使用 name scope 来确定模块的作用范围,添加部分名称和作用域,否则网络图会非常复杂。与上面类似,我们同样定义一个三层的卷积网络(代码还是看 git)。


要想利用 tensorboard 进行可视化,必须在 session 中通过 summary 存储网络图,只需要在训练代码中添加命令即可,summary = tf.summary.FileWriter(“output”, sess.graph)。


最后利用 tensorboard 命令来查看训练结果和可视化结果,网络的可视化结果如下。



可以看出,网络的结构可视化和 caffe 的差不多。除了 caffe 的网络结构可视化是输入模型配置文件,大部分的深度学习框架都使用了 python 进行开发,模型结构的可视化与 tensorflow 结果差不多。相比较来说,caffe 的模型可视化方法更加简单直接,独立于代码,可以更便捷地看到每一层的参数配置。

02

卷积参数可视化

前面我们可视化了网络的结构,从而对要训练的网络就有了整体的把握。当我们得到了训练结果之后,一个模型常有百万千万级别的参数,我们能否通过可视化的方法,来评判一下这个网络结构的好坏呢?通常情况下,我们希望网络结构学习到的权重,模式足够丰富,这样才有强大的表征能力。

2.1 浅层卷积参数可视化

网络的早期卷积学习到的是通用的特征,由于大部分网络的输入都是彩色图,所以数据层的通道数为 3。正好我们平时用的彩色图的通道就是 3 维,这时候如果直接将这 3 组通道转换为一个彩色图,我们就可以很直观的可视化这第一层的卷积参数,对于任意以输入图为 3 通道彩色图的网络结构来说,这都是通用的。


下面是 alexnet 学习到的权重的第一层卷积的可视化。



这其中有一些卷积核为灰度图,说明三个通道的对应参数相近,学习到的是与颜色无关的特征。有的为彩色图,说明 3 个通道的特征差异大,学习到的是与颜色有关的特征。这与上面人眼和感知特性也是相通的,在底层,学习到的是边缘,形状,颜色等敏感等信息。


细心的读者应该可以注意到,上面的参数,具有一定的互补性和对称性。

2.2 高层卷积参数可视化

到了高层,由于输入的通道数不再为 3,所以无法像第一层那样,将其投射到图像空间进行直观的可视化。


这时候就有了两种思路。分别是 dataset-centric 和 network-centric 方法。他们的区别就是,第一个要可视化核函数,必须要使用真实的输入数据。第二个,则是通过生成一个随机图片,然后进行迭代的方法,来最大化响应层的神经元的激活,这个时候为使得输入的图片更加平滑,可以考虑使用 GAN 等方法。


主要的研究方法包括两种,反卷积法【2】和梯度计算法【3】。


反卷积方法的核心思想就是利用上采样从特征空间逐步恢复到图像空间。假设我们要可视化第 1 个 feature map 的一个 unit,即特征图的一个像素的 activation,则首先从数据集中计算一下多个输入图像各自经过前向传播后在这个 unit 上产生的 activation,取出 activation 最大的一些图像,这些图像作为输入图。


然后将输入图分别在这个 unit 上产生的 activation 进行反向传播,其他位置置为零。其中与 pooling 对应的就是 uppooling,它通过在 max pooling 的时候记录下最大激活位置,在反卷积的时候进行恢复。与卷积对应的操作就是转置卷积操作,这是被用于图像分割的方法,也是通常意义上所说的反卷积。


反卷积的结果,就是一个重建的图。



梯度计算法包括标准的梯度计算法以及它的一些改进版本 integrated gradients,guided backprop,基本原理如下,在训练的过程中固定网络的参数不变,学习输入。



反卷积法和梯度计算法可视化出来的结果,可以反映出神经元学习到的类别的轮廓,但是结果不够精细。GoogleBrain 团队的 deep dream【4】研究,对 inception 网络进行了逐层的特征可视化,揭示了每一个网络层的特性。该项目是通过输入随机噪声和想让网络学习的图像的先验知识,最后可视化网络学习到的该类的结果,虽然不是现实存在的图像,但是却具有该类别的特性,如同人类梦境中生成的不真实却又有辨识度的场景一样。


下面展示了 layer 4c 层的一个神经元的结果。


03

激活热图可视化

可视化了卷积参数,它可以反映出所学习到的网络的参数本身有什么样的特点,它是从神经元的角度解释了 CNN,而激活热图可视化考虑从输入图像的角度解释 CNN。它从输入图像中找出激活卷积层中特定神经元的选择性模式,来反应网络到底学习到了什么信息。


特征图可视化的结果是 sensitivity map,也叫 saliency maps,以 CAM(Class Activation Mapping)【5】方法及其变种为代表。


CAM 利用 GAP(Global Average Pooling)替换掉了全连接层,将输出通道调整为输出类别数,再加权然后通过 softmax 层得到结果,可视化原理图如下:



看上图,最后输入 softmax 的特征图,等于 k 个 featuremap 的加权和,其中 w 系数包括 c 维,c 等于类别数目。等到了热力图之后,直接上采样到原图中就能得到激活区域,因为 featuremap 保留了原图的空间关系。

04

训练过程可视化

最后,我们通过 tensorflow 可视化开源框架来展示在项目中的可视化,由于我们前面已经有许多期文章讲述过可视化的各个模块细节,所以此处就不再做技术细节展示,而只展示结果。


项目是这个:


https://github.com/carpedm20/DCGAN-tensorflow,我们用来生成了一批嘴唇数据。

4.1 loss 可视化

loss 等标量指标可视化可以反应网络的学习情况,是必须关注的。



4.2 中间结果可视化


对于图像生成任务,没有什么比查看中间结果更加有说服力的了。

4.3 网络结构可视化


tensorflow 可视化网络结果虽然比 caffe 更加复杂,但也更加细致,关注关注没有坏处。


另外,还可以查看权重的直方图分布等等,对于网络的性能判断也有辅助作用。


参考文献


[1] Erhan D, Bengio Y, Courville A, et al. Visualizing higher-layer features of a deep network[J]. University of Montreal, 2009, 1341(3): 1.


[2] Zeiler M D, Fergus R. Visualizing and Understanding Convolutional Networks[J]. 2013, 8689:818-833.


[3] Simonyan K, Vedaldi A, Zisserman A. Deep inside convolutional networks: Visualising image classification models and saliency maps[J]. arXiv preprint arXiv:1312.6034, 2013.


[4] https://distill.pub/2017/feature-visualization/ 


[5] Zhou B, Khosla A, Lapedriza A, et al. Learning deep features for discriminative localization[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 2921-2929.


[6] How convolutional neural network see the world - A survey of convolutional neural network visualization methods

作者介绍

言有三,真名龙鹏,曾先后就职于奇虎 360AI 研究院、陌陌深度学习实验室,6 年多计算机视觉从业经验,拥有丰富的传统图像算法和深度学习图像项目经验,拥有技术公众号《有三 AI》,著有书籍《深度学习之图像识别:核心技术与案例实战》。

原文链接

https://mp.weixin.qq.com/s?src=11&timestamp=1567841881&ver=1837&signature=ReZUMBVtUDn4WRb9pTeSIuVntViSxlYaTyF328OsSRW7v0MJvdHyj9zpQgTtraWRl5Eev-bEwsVlJ6I5JouZdjrbI3MezeWX5L9Gtl*ipMWYzg1KNBALjkHl7X7xMLy&new=1


2019-09-07 16:004292

评论

发布
暂无评论
发现更多内容

【等保】等保全称是什么?英文咋说?

行云管家

等保 等级保护 等保2.0

使用 PAI-Blade 优化 Stable Diffusion 推理流程

阿里云大数据AI技术

人工智能 推理 Stable Diffusion 企业号 5 月 PK 榜

Serverless冷扩机器在压测中被击穿问题 | 京东云技术团队

京东科技开发者

Serverless GC 击穿 企业号 5 月 PK 榜 Serverless扩容

Github星标百万!终于有人将Spring技术精髓收录成册

做梦都在改BUG

Java spring 框架

OpenHarmony支持HDMI接口声卡适配说明

OpenHarmony开发者

OpenHarmony

云纳管是什么意思?云纳管平台哪个好?

行云管家

云计算 云服务 云平台 云管平台 云纳管

MSE 自治服务帮你快速定位解决 Dubbo 重复订阅导致 RPC 服务注册失败问题

阿里巴巴云原生

阿里云 云原生 dubbo MSE

Java性能优化实践与策略

xfgg

Java 优化 规范

Openjob:更强大、更智能的分布式任务调度框架,重磅发布!

stelin

java; 后端、 分布式,

惊艳!腾讯强推599页Netty进阶神技,完美诠释Netty

做梦都在改BUG

Java Netty

开发神技!阿里消息中间件进阶手册限时开源,请接住我的下巴

做梦都在改BUG

Java kafka 分布式 MQ 消息中间件

肝到头秃!百度强推并发编程笔记我爱了,原来这才叫并发

做梦都在改BUG

Java 并发编程

京东购物车如何提升30%性能 | 京东云技术团队

京东科技开发者

性能优化 RPC 企业号 5 月 PK 榜 京东购物车 异步改造

Kafka生产者你不得不知的那些事儿

做梦都在改BUG

深度学习基础入门篇[9.3]:卷积算子:空洞卷积、分组卷积、可分离卷积、可变性卷积等详细讲解以及应用场景和应用实例剖析

汀丶人工智能

人工智能 深度学习 卷积网络 空洞卷积 分组卷积

kafka生产者你不得不知的那些事儿

JAVA旭阳

Java kafka

SpringBoot 中异步任务实现及自定义线程池执行异步任务

做梦都在改BUG

Java Spring Boot

绕不过的并发编程——synchronized原理

Java你猿哥

Java 并发编程 ssm synchronized

Deferred Components-实现Flutter运行时动态下发Dart代码 | 京东云技术团队

京东科技开发者

flutter dart 企业号 5 月 PK 榜 Deferred Components

探索未来智能交通:网联汽车与汽车互联

EMQ映云科技

车联网 物联网 智能交通 汽车互联

低代码开发平台魔笔 X 浙江广电集团:“10天”成为行业最小创新单位!

移动研发平台EMAS

阿里云 低代码开发 魔笔

IPQ8072 or IPQ8072A with the QCN9074/9024 chipset / well-suited for high-end routers.

Cindy-wallys

IPQ8072

新一代企业数字化联盟成立,“强强联手”搭建品牌服务生态

数划云

数字化 全面预算管理 新一代企业数字化联盟 数划云 绩效分析

真香!阿里最新产出分布式进阶实战手册,涵盖分布式架构所有操作

Java你猿哥

架构 分布式 微服务 Spring Cloud Spring Boot

阿里微服务实施手册我粉了,原来微服务还可以这样玩

做梦都在改BUG

Java 架构 微服务 Spring Cloud

ChatGPT的原理与前端领域实践 | 京东云技术团队

京东科技开发者

人工智能 前端 ChatGPT 企业号 5 月 PK 榜

人工智能将如何改变敏捷项目管理?

敏捷开发

人工智能 项目管理 AI 敏捷开发 Scrum Master

百万级数据导出优化方案

做梦都在改BUG

深度学习基础入门篇[10]:序列模型-词表示{One-Hot编码、Word Embedding、Word2Vec、词向量的一些有趣应用}

汀丶人工智能

人工智能 深度学习 nlp 词向量 序列模型

大数据如何助力营销(5)活动复盘

MobTech袤博科技

软件测试/测试开发丨学习笔记之Pytest使用

测试人

Python 软件测试 自动化测试 测试开发 pytest

“看透”神经网络_AI&大模型_言有三_InfoQ精选文章