内容纲要

欢迎转载,作者:Ling,注明出处:深度学习:原理简明教程17-深度学习:CNN可视化

 

本文将讨论CNN可视化相关问题。

 

人们常说深度学习模型是黑盒模型,很难知道里面参数含义,但是对于CNN而言,研究者们已经提出各种可视化方法,使得CNN不再黑盒。

 

对于CNN可视化主要有以下几类:

1)可视化隐含层特征。它可以帮助人们理解每个CNN filter将输入变成了什么输出。

2)可视化CNN的Filters。它可以帮助人们准确地理解每个filter代表什么模式。

3)可视化激活的类别。它可以帮助人们理解图片哪部分决定了最后的类别。

 

可视化隐含层特征。主要两种办法

1)可视化intermediate activations,即可视化每个隐含层的输出结果。

2)通过将隐含层特征进行逆向得到输入,可以知道究竟隐含层的特征对应的原始图是什么。

 

可视化intermediate activations,即可视化每个隐含层的输出结果:

做法:很简单,训练好模型,然后输入一张图片,然后可视化每个convolution激活之后的结果。

假设我们训练了一个区分是猫还是狗的模型

dl_17_001

输入图片:

dl_17_002

我们取出first layer激活之后的第4个channel的结果:

dl_17_003

从图中我们可以看出,它主要识别出了edge信息。

我们取出first layer激活之后的第7个channel的结果:

dl_17_004

从图中我们可以看出,它主要识别出了绿色原点的信息。

我们输出conv2d_5到Conv2d_8的所有Filter得到的每个的输出结果:

dl_17_005

解释:

1)convolution2d_5表示第一个convolution经过激活函数后的输出结果

2)为什么convolution2d_5有32张图片?因为convolution2d_5有32个filter,每个图片对应一个filter

3)不同layer结果有啥规律?

  • 第一层识别了各种edge信息,第一层输出结果还保留了原始图片很多信息
  • 越往高层走,信息越抽象,比如图像中是猫耳朵,猫眼睛,越少关于原图的信息,而越多关于类别的信息
  • 越往高层走,越稀疏,你可以看到很多空白的channel,留下的有内容的channel都是非常抽象的可以反映类别的channel,和类别无关的都是空白。

 

通过将隐含层特征进行逆向得到输入,可以知道究竟隐含层的特征对应的原始图是什么。

做法:

dl_17_006

1)训练好模型。

2)输入图片。正向:经过conv->relu->max pooling得到隐含层pooling之后结果,然后再将该结果经过反向un max pooling->relu->反卷积得到一张对应隐含层输出结果的图片。

2)正向过程容易理解,就是传统cnn做法,反向过程如下:

  • Unpooling:在max-pooling中利用switches表格记录每个最大值的位置,然后在unpooling中奖该位置填回最大数值,其余位置填0。
  • ReLU:直接利用ReLU函数,仍然确保输出为非负数。
  • 反卷积:利用相同卷积核的转置作为核,与输入做卷积运算。

实验结果

除了第一层,其他层,左边每个格子是输入某张图片,得到中间layer i可视化出来的结果,而他们对应右边彩色图相应格子是将它们通过unpooling和反卷积还原出来的彩色图片。注意每个格子都是一个训练样本得到的结果。不同格子是不同训练样本的结果。

第一层,一个格子对应彩色的九个格子,稍微有点不一样。

通过分析我们可以知道

越早的层,可视化结果越简单,比如是edge,颜色,深浅等特征,越深的层越抽象,是前面层的组合,形成更接近实际物体的东西。

层数越高,所提取的特征越抽象,如图3。层2展示了物体的边缘和轮廓,颜色等,层3展示了纹理,层4层5开始体现类与类的差异。

dl_17_007

dl_17_008

可视化CNN的Filters。它可以帮助人们准确地理解每个filter代表什么模式

这里有两个问题:

1)如何可视化?

2)可视化结果说明啥?

 

如何可视化?

这里我结合一段代码来解释如何可视化(代码很简单):

dl_17_009

解释:

1)

输入:希望可视化的层,该层希望可视化哪个filter,以及可视化的图片大小

输出:一张随机的灰度图片经过该filter,最大化之后的结果。

2)

首先,从训练好的VGG模型中取出目标层的输出结果

然后,对输出结果目标filter的输出结果求均值,以此作为loss,我们目标是要让filter尽可能大的影响输出结果,所以loss应该越大越好

接着,通过梯度上升的方法,多次迭代,让filter尽可能大的处理灰度图片,得到结果图片。

 

可视化结果说明啥?

第一层的第0个filter输出结果:

dl_17_010

filter作用是是的输入图片提取点原点的特征。

 

5个layer,每个layer的前64个输出图片结果如下:

block1_conv1:

dl_17_011

block2_conv1:

dl_17_012

block3_conv1:

dl_17_013

block4_conv1:

dl_17_014

分析:

1)第一层的filter主要提取edge和color

2)第二层的filter主要提取edge和color组合成的东西

3)更高层filter是更加抽象,组合更加复杂的东西

 

可视化激活的类别。它可以帮助人们理解图片哪部分决定了最后的类别。

实例:

对该图片进行分类,识别出大象。

dl_17_015

将主要认定该图是非洲象的部分做成热图:

dl_17_016

从图中可以看出主要是通过鼻子牙齿耳朵等。

这种技术可以帮助查看到底是图像哪部分最终决定了最后的类别。

 

Class Activation Map

论文:[Grad-CAM: Why did you say that? Visual Explanations from Deep Networks via Gradient-based Localization]

做法:

1)需要生成一个热图,然后和原图合成:

dl_17_017

2)如何得到热图?

给定一个输入图片,得到convolution的输出的feature map

对feature map的每个channel:通过对类别计算梯度。

“不同channel对输入的激活程度”反映了“每个channel对类别影响的程度”

Grad-CAM算法:

dl_17_018

解释:

1)非洲象属于类别386,取出它的vector

2)取出最后一个conv layer

3)建立真实与最后一层输出的梯度下降公式

4)对梯度求均值

5)经过迭代得到梯度均值和最后一层输出结果

6)分别对每个channel(512个channel)求输出与梯度的乘积,这个值反应了每个点对结果的影响程度

7)分别对每个channel求均值,如果该channel均值大,说明影响大

 

至此,CNN主流可视化技术都介绍了一遍。