深度学习:原理简明教程17-深度学习:CNN可视化
欢迎转载,作者:Ling,注明出处:深度学习:原理简明教程17-深度学习:CNN可视化
本文将讨论CNN可视化相关问题。
人们常说深度学习模型是黑盒模型,很难知道里面参数含义,但是对于CNN而言,研究者们已经提出各种可视化方法,使得CNN不再黑盒。
对于CNN可视化主要有以下几类:
1)可视化隐含层特征。它可以帮助人们理解每个CNN filter将输入变成了什么输出。
2)可视化CNN的Filters。它可以帮助人们准确地理解每个filter代表什么模式。
3)可视化激活的类别。它可以帮助人们理解图片哪部分决定了最后的类别。
可视化隐含层特征。主要两种办法:
1)可视化intermediate activations,即可视化每个隐含层的输出结果。
2)通过将隐含层特征进行逆向得到输入,可以知道究竟隐含层的特征对应的原始图是什么。
可视化intermediate activations,即可视化每个隐含层的输出结果:
做法:很简单,训练好模型,然后输入一张图片,然后可视化每个convolution激活之后的结果。
假设我们训练了一个区分是猫还是狗的模型:
输入图片:
我们取出first layer激活之后的第4个channel的结果:
从图中我们可以看出,它主要识别出了edge信息。
我们取出first layer激活之后的第7个channel的结果:
从图中我们可以看出,它主要识别出了绿色原点的信息。
我们输出conv2d_5到Conv2d_8的所有Filter得到的每个的输出结果:
解释:
1)convolution2d_5表示第一个convolution经过激活函数后的输出结果
2)为什么convolution2d_5有32张图片?因为convolution2d_5有32个filter,每个图片对应一个filter
3)不同layer结果有啥规律?
- 第一层识别了各种edge信息,第一层输出结果还保留了原始图片很多信息
- 越往高层走,信息越抽象,比如图像中是猫耳朵,猫眼睛,越少关于原图的信息,而越多关于类别的信息
- 越往高层走,越稀疏,你可以看到很多空白的channel,留下的有内容的channel都是非常抽象的可以反映类别的channel,和类别无关的都是空白。
通过将隐含层特征进行逆向得到输入,可以知道究竟隐含层的特征对应的原始图是什么。
做法:
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开始体现类与类的差异。
可视化CNN的Filters。它可以帮助人们准确地理解每个filter代表什么模式
这里有两个问题:
1)如何可视化?
2)可视化结果说明啥?
如何可视化?
这里我结合一段代码来解释如何可视化(代码很简单):
解释:
1)
输入:希望可视化的层,该层希望可视化哪个filter,以及可视化的图片大小
输出:一张随机的灰度图片经过该filter,最大化之后的结果。
2)
首先,从训练好的VGG模型中取出目标层的输出结果
然后,对输出结果目标filter的输出结果求均值,以此作为loss,我们目标是要让filter尽可能大的影响输出结果,所以loss应该越大越好
接着,通过梯度上升的方法,多次迭代,让filter尽可能大的处理灰度图片,得到结果图片。
可视化结果说明啥?
第一层的第0个filter输出结果:
filter作用是是的输入图片提取点原点的特征。
5个layer,每个layer的前64个输出图片结果如下:
block1_conv1:
block2_conv1:
block3_conv1:
block4_conv1:
分析:
1)第一层的filter主要提取edge和color
2)第二层的filter主要提取edge和color组合成的东西
3)更高层filter是更加抽象,组合更加复杂的东西
可视化激活的类别。它可以帮助人们理解图片哪部分决定了最后的类别。
实例:
对该图片进行分类,识别出大象。
将主要认定该图是非洲象的部分做成热图:
从图中可以看出主要是通过鼻子牙齿耳朵等。
这种技术可以帮助查看到底是图像哪部分最终决定了最后的类别。
Class Activation Map
论文:[Grad-CAM: Why did you say that? Visual Explanations from Deep Networks via Gradient-based Localization]
做法:
1)需要生成一个热图,然后和原图合成:
2)如何得到热图?
给定一个输入图片,得到convolution的输出的feature map
对feature map的每个channel:通过对类别计算梯度。
“不同channel对输入的激活程度”反映了“每个channel对类别影响的程度”
Grad-CAM算法:
解释:
1)非洲象属于类别386,取出它的vector
2)取出最后一个conv layer
3)建立真实与最后一层输出的梯度下降公式
4)对梯度求均值
5)经过迭代得到梯度均值和最后一层输出结果
6)分别对每个channel(512个channel)求输出与梯度的乘积,这个值反应了每个点对结果的影响程度
7)分别对每个channel求均值,如果该channel均值大,说明影响大
至此,CNN主流可视化技术都介绍了一遍。
留言