CNN的隐层到底是什么样子的?本博文主要讲解zerler提出的一种反卷积的技术,来可视化隐层内容。
反卷积
直接显示隐层值是不可观察的,如果能够反向映射到输入的像素空间内,岂不是很好,就可以从人的认识层面来可视化隐层的内容了。多么聪明地想法,剩下的问题就是如何由隐层反向计算到输入层。
转置卷积
将filter-bank直接转置,对feature-map做卷积计算,得到输入。
注意:这里不是卷积的逆操作,而只是做个转置,再计算卷积而已。不能重构出真实输入值。
举例:
正向计算:[64×64×3]−→−−−−−−4×5×3×100卷积[64×64×100]
filter-bank [4×5×3×100]的转置是这样的:4×5×100×3
反向计算:[64×64×100]−→−−−−−−4×5×100×3卷积[64×64×3]
ReLU反向计算
ReLU=max{0,wx+b},是取正的运算,反向计算也取正,同样为ReLU。
Pooling反向计算
对Max-Pooling,需要记录正向计算时的最大值位置,然后将最大值回填,其他位置置零。
对Avg-Pooling,将当前值回填全部位置。
如果熟悉梯度后传在pool上的操作,你会发现是一样的动作。
某个activation的反卷积
针对某个隐层,想观察某个feature-map上的activation,则将该层上的所有activation置零,然后按照网络结构,依结构顺序进行上述反向计算,直到到达输入像素层。
注意:是该层上所有其他activation置零。
靠谱验证
这样的反向计算到底靠谱么?这是非常关心的。作者给出了个遮挡验证如下:
遮挡可视化出来的输入像素点,则对应的做反向可视化的那些activation会急剧下降。
说明什么?说明,虽然转置卷积计算可视化不是真实值的还原,但仍然是隐层activation的有效体现。在没有更好的方法时,这种可视化就是靠谱的。
关于Fig.2的生成说明
如果看过第二篇参考文献,大体上就能明白“show the top 9 activations in a random subset of feature maps accross the validation data”,反向卷积也来自于此篇文献。
具体怎么生成Fig.2的,解释如下:
1)先随机选择个feature-map,然后检查validataion-data在这个feature-map上的activation值,挑选top-9个activation,逐个反向计算到输入层(按照“某个activation的反卷积”操作来反向计算)。
2)对每个层,都执行几次1)过程,将可视化结果拼到一起。
注意:这里的top-9已经约束到了同一个feature-map上了,所以后面有个同feature-map具有同质性的小结论。
隐层layer-4的两个feature-map上的top-9的activation反向计算的可视化图,狗表图,哈哈。
关于可视化,完全可以自行将每层的每个feature-map上的top-N可视化到输入层,再叠加到一起。
其他有意思结果
1)关于帮助改进CNN网络结构的。
2)关于CNN是否会学习location的验证。是。
3)关于CNN特征不变性的探究。
4)同feature-map内的强同质性结论。
注意:《visualization》paper是用Alex-Net来做的,Alex是当前已知网络中参数利用率最低的网络结构。
其他可视化方法
近似估计
从正向的角度推测隐层的可视化值。
已知训练好的网络,假设到某层的inference-function是Φ(x),已知样本x0,若是能够生成一个样本x,使得
x∗=argmin{L(Φ(x0),Φ(x))+λR(x)}
其中R(x)是正则项。详细见参考三。
orig-deconv
Deconv做训练时的一个方法,多个activation叠加到一起,具体如下:
1) 对一张输入图,在某个层上,选择top-3的activation。
2) 方向计算输入像素值,将结果叠加到一块。
注意:这里的activation约束在同层内,而不是桶feature-map上。
结论:同层内的不同activation重构了图片的不同局部。
效果图如下:
参考
- 《2013-Visualization and Understanding the Convoluational Networks》
- 《2011-Adaptive Deconvolutional Networks for Mid and High Level Feature Learning》
- 《2014-Understanding Deep Image Representations by Inverting Them》