《Visualizing and Understanding Convolutional Networks》
Matthew D Zeiler, Rob Fergus (ECCV2014)
论 文 :http://t.cn/RyYKQ8z
视频: http://t.cn/RyYKQ87
------------------------------------------------------------------------------------------------------
一、相关理论
这篇文献告诉我们CNN的每一层到底学习到了什么特征,然后作者通过可视化进行调整网络。很多学者都不明白,为什么通过某种调参、改动网络结构等,精度会提高。可能某一天,我们搞CNN某个项目任务的时候,你调整了某个参数,结果精度飙升,但如果别人问你,为什么这样调参精度会飙升呢,你所设计的CNN到底学习到了什么牛逼的特征?
这篇文献的目的,就是要通过特征可视化,查看精度变化,从而知道CNN学习到的特征如何。这篇文献是经典必读文献。
多项技术帮助CNN复兴(最早是98年,LeCun提出的):
1,大的标定数据集;
2,Gpu使得大规模计算成为可能;
3,很好的模型泛化技术
本文的可视化方法是一种非参数化的可视化技术
二、利用反卷积实现特征可视化
1、为了解释卷积神经网络如何工作,我们就需要解释CNN的每一层学习到了什么东西。为了理解网络中间的每一层,提取到特征,论文通过反卷积的方法,进行可视化。反卷积网络可以看成是卷积网络的逆过程。反卷积网络在文献《Adaptive deconvolutional networks for mid and high level feature learning》中被提出,是用于无监督学习的。
反卷积可视化以各层得到的特征图作为输入,进行反卷积,得到反卷积结果,用以验证显示各层提取到的特征图。Eg:假如你想要查看Alexnet的conv5提取到了什么东西,我们就用conv5的特征图后面接一个反卷积网络,然后通过:反池化、反激活、反卷积,这样的一个过程,把本来一张13*13大小的特征图(conv5大小为13*13),放大回去,最后得到一张与原始输入图片一样大小的图片(227*227)。
1、反池化过程
池化是不可逆的过程,然而我们可以通过记录池化过程中,最大激活值的坐标位置。然后在反池化的时候,只把池化过程中最大激活值所在的位置坐标的值激活,其它的值置为0,当然这个过程只是一种近似,因为我们在池化的过程中,除了最大值所在的位置,其它的值也是不为0的。刚好最近几天看到文献:《Stacked What-Where Auto-encoders》,里面有个反卷积示意图画的比较好,所有就截下图,用这篇文献的示意图进行讲解:
以上面的图片为例,上面的图片中左边表示pooling过程,右边表示unpooling过程。假设我们pooling块的大小是3*3,采用max pooling后,我们可以得到一个输出神经元其激活值为9,pooling是一个下采样的过程,本来是3*3大小,经过pooling后,就变成了1*1大小的图片了。而upooling刚好与pooling过程相反,它是一个上采样的过程,是pooling的一个反向运算,当我们由一个神经元要扩展到3*3个神经元的时候,我们需要借助于pooling过程中,记录下最大值所在的位置坐标(0,1),然后在unpooling过程的时候,就把(0,1)这个像素点的位置填上去,其它的神经元激活值全部为0。再来一个例子:
在max pooling的时候,我们不仅要得到最大值,同时还要记录下最大值得坐标(-1,-1),然后再unpooling的时候,就直接把(-1-1)这个点的值填上去,其它的激活值全部为0。
2、反激活
我们在Alexnet中,relu函数是用于保证每层输出的激活值都是正数,因此对于反向过程,我们同样需要保证每层的特征图为正值,也就是说这个反激活过程和激活过程没有什么差别,都是直接采用relu函数。
3、反卷积
对于反卷积过程,采用卷积过程转置后的滤波器(参数一样,只不过把参数矩阵水平和垂直方向翻转了一下)。
最后可视化网络结构如下:
网络的整个过程,从右边开始:输入图片->卷积->Relu->最大池化->得到结果特征图->反池化->Relu->反卷积。
总的来说算法主要有两个关键点:1、反池化 2、反卷积。
三、理解可视化
特征可视化:一旦我们的网络训练完毕了,我们就可以进行可视化,查看学习到了什么东西。我们利用上面的反卷积网络,对每一层的特征图进行查看。
1、特征可视化结果:
总的来说,通过CNN学习后,我们学习到的特征,是具有辨别性的特征,通过CNN学习后,背景部位的激活度基本很少,我们通过可视化就可以看到我们提取到的特征忽视了背景,而是把关键的信息给提取出来了。从layer 1、layer 2学习到的特征基本上是颜色、边缘、轮廓等低层特征;layer 3则开始稍微变得复杂,学习到的是纹理特征,比如上面的一些网格纹理;layer 4学习到的则是比较有区别性的特征;layer 5学习到的则是完整的,具有辨别性关键特征。
也就是说层数越高,所提取的特征越抽象。
2、特征学习的过程。在网络训练过程中,每一层学习到的特征是怎么变化的,经过一定次数的迭代之后,底层特征趋于稳定,但更高层特征要更多次迭代才能收敛,下面每一整张图片是网络的某一层特征图,然后每一行有8个小图片,分别表示网络epochs次数为:1、2、5、10、20、30、40、64的特征图:
结果:
(1)仔细看每一层,在迭代的过程中的变化,出现了sudden jumps;
(2)从层与层之间做比较,我们可以看到,低层在训练的过程中基本没啥变化,比较容易收敛,高层的特征学习则变化很大。这解释了低层网络的从训练开始,基本上没有太大的变化,因为梯度弥散嘛。
(3)从高层网络conv5的变化过程,我们可以看到,刚开始几次的迭代,基本变化不是很大,但是到了40~50的迭代的时候,变化很大,因此我们以后在训练网络的时候,不要着急看结果,看结果需要保证网络收敛。
3、图像变换。从文献中的图片5可视化结果,我们可以看到对于一张经过缩放、平移等操作的图片来说:对网络的第一层影响比较大,到了后面几层,基本上这些变换提取到的特征没什么比较大的变化(特征不变性)如图,层数越低,很小的变化都能导致输出特征的变化,但层数越高,影响的结果较小。在最终的正确概率中,略微的位移和缩放都不会改变正确率,但卷积网络无法对旋转产生良好的鲁棒性(如果有良好的对称性,则正确率会产生频率一定的波动)
列1表示图像变化(垂直移动、缩放和旋转),列2表示层1中原始图像特征向量与改变后特征向量的欧氏距离,列3为层7中的欧氏距离,列4是最后分类器输出正确的概率。
结构选取
第一层卷积核从11*11调整为7*7,步幅大小从4调整为2,优化了最后的结果。
通过可视化Alex-net网络的第1,2层(图中的b和d),发现了各种问题。
问题1:第一层filter是非常高频和低频的信息,中间频率的filter很少覆盖
问题2:第二层的可视化比较混淆,由于第一层比较大的间隔。
为了解决这个问题:
1,减小第一层的filter的尺寸从11*11到7*7
2,缩小间隔,从4变为2。
这两个改动形成的新结构,获取了更多的信息,而且提升了分类准确率。
遮挡敏感性
对于图像分类,一个自然的想法就是这个模型是真正鉴别了物体在图像中的位置,还是只是使用了周围的场景。研究图片内部哪个区域产生的作用最大,所以进行了遮挡实验。本文通过一个灰色方块,遮盖物体的不同位置,然后监控分类器的输出。最后结果证明模型定位了场景中的物体
列1表示图像被随机遮挡,列2表示第五层特征图最强输出,列3带黑框为被遮挡后特征向量投影到像素空间,列4为被遮挡后分类的正确率,列5为被遮挡后最可能的分类。
图片内特征相关性分析
深度模型不同与其他识别方法,它没有明显建立对应关系的机制(脸中有鼻子和眼);但是深度模型可能隐式地建立了对应机制。
为了验证这一点,我们随机选择了5张包含狗正脸的图片;然后遮蔽相同的部分来观察。
观察方法:
首先计算图片遮蔽前后特征,两个特征向量做差,通过sign来确定符号;然后通过海明距离来计算5张照片两两之间的一致性,然后求和
对图片内某些特征进行遮挡,如图7。
l是层号,表示在l层中,图i在进行遮挡前与遮挡后的差值。通过Δ来计算特征的相关性。
Sign为符号函数,H为汉明距离,如果Δ值越小,则该操作所遮挡的图像特征和图像其他特征的相关性越高。最后得出结果如表1。
与随机进行遮挡相比,遮挡眼睛和鼻子所得到的Δ值较小,证明眼睛和鼻子与图片内部其他特征存在相关性。特别的,与层5相比,在层7中的Δ值普遍不大,证明在高层中,已经不关注图像的部件级特征,而更关注品类等高级信息。
实验
→LRN→max-p(3,3,2)→256F(5,5,96,2)→LRN→max-p(3,3,2)→384F(3,3,256,1)→384F(3,3,384,1) →256F(3,3,384,1)→max-p(3,3,2)→4096fc→4096fc→softmax
对比Alex-net本文的结构改进汇总:
1,layer-1的filter尺寸7*7
2,layer-1的间隔距离 S=2
3,全连接,而不是局部连接
4,初始化偏执bias=0.
表2
在通过复现了网络(表中(a))之后,通过改变卷积核大小、步幅和特征图大小(第一层卷积核从11*11调整为7*7,步幅大小从4调整为2),最终达到了14.8%的Top-5准确率,比当时公开的数据都要精确,且只用了12年的dataset。
表3删除了一些层和参数来验证不同的层和参数会对结果造成什么影响,在每个删除后都会进行重新训练。最终发现删除6、7层全连接层,错误率只有轻微提升,删掉两层卷积层错误率也没有明显提升,但删除这四层之后,错误率急剧提升,这可能表明总体深度对模型很重要。扩大全连接层基本无效,扩大卷积层有一点提升,但扩大他们会导致过拟合。
特征泛化能力
在不改变模型1~7层训练结果,只训练softmax层的情况下,又进行了Caltch-101、Caltch-256、PASCAL VOC 2012三个库的测试。还应用到了其他分类器。
Caltch-101库:如表4。重新训练的准确率并不高,但经过ImageNet数据训练后的网络比历史最好成绩还要好2.2%。
Caltch-256库:如表5。重新训练的准确率并不高,但经过ImageNet数据训练后的网络比历史最好成绩还要好19%。
Caltch-256库:如表6。重新训练的准确率并不高,但经过ImageNet数据训练后的网络比历史最好成绩还要好19%。
探索在ImageNet数据集上通过监督学习到的特征,推广到其他数据集上。具体方法是保持网络的1到7层不变,改变softmax层最终的类别数。
说明ImageNet特征提取具有很好的特征提取能力。但是在pascal上却比当前最好成绩差3.2%,这是由于pascal数据集和ImageNet数据集有很大的不通过,pascal数据集上有多个物体。
总结:
1.在扩充训练集的时候,调整图像角度是关键,不需要过多的将图像切割成多片进行训练;
2.仔细考虑每个层对其他层的影响,可适当精简层,特别是全连接层;
3.可先进行其他数据集的预训练。
4、大部分CNN结构中,如果网络的输出是一整张图片的话,那么就需要使用到反卷积网络,比如图片语义分割、图片去模糊、可视化、图片无监督学习、图片深度估计,像这种网络的输出是一整张图片的任务,很多都有相关的文献,而且都是利用了反卷积网络。
5、提出了一个新颖的可视化方法,通过可视化证明了卷积网络的一些特征,复合性,特征不变性和网络深度的关系;
6、通过可视化还可以调试网络结构,通过遮蔽实验证明网络学习到一种隐的相关性,通过削减实验证明深度很重要
7、特征推广
参考文献:
1、《Visualizing and Understanding Convolutional Networks》
2、《Adaptive deconvolutional networks for mid and high level feature learning》
3、《Stacked What-Where Auto-encoders》