原文地址:地址1,本文在此基础上进行了整理和划重点
本文文献:Zeiler, Matthew D.; Fergus, Rob,"Visualizing and Understanding Convolutional Networks". In: Proc. European Conference on Computer Vision (ECCV), pp. 1-14, 2014. Zurich, Switzerland.
反卷积网络的提出:《Adaptive deconvolutional networks for mid and high level feature learning》
1. 该文处理的问题
a. 问题:
最近两年深层的卷积神经网络,进展非常惊人,在计算机视觉方面,识别精度不断的突破,CVPR上的关于CNN的文献一大堆。比如调整了某个参数,CNN结果精度飙升,但如果别人问你,为什么这样调参精度会飙升呢,你所设计的CNN到底学习到了什么特征?
b. 处理:
这篇文献的目的,就是要通过特征可视化,查看你的精度确实提高了,看到你设计的CNN学习到的特征。
2. 该文采取的思路和方法,及为什么能解决所处理的问题?
a. 采取的思路和方法
前提:
反卷积网络在文献是用于无监督学习的。然而本文的反卷积过程并不具备学习的能力,仅仅是用于可视化一个已经训练好的卷积网络模型,没有学习训练的过程。
过程总述:
输入(各层得到的特征图)——> 过程(反池化,反激活,反卷积)——> 输出(反卷积结果,可视化各层得到的特征图)
过程具体:
1. 反池化
池化本质是不可逆的过程,在这里采用近似方法模拟可逆的过程。首先记录池化过程中,最大激活值得坐标位置。然后在反池化的时候,只把池化过程中最大激活值所在的位置坐标的值激活,其它的像素值置为0。因为在池化的过程中,除了最大值所在的位置,其它的值也是不为0的,所以上述操作只是一种近似。示意图:
以上面的图片为例,上面的图片中左边表示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 <— 反池化 <— 特征图
b. 为什么能解决所处理的问题
已有方法的特征:
- 一类方法集中于研究训练反卷及网络的图像语义分割(将像素还原成图像)
- 一类方法集中于研究训练反卷积网络从而生成图像或者图形
本文方法的创新之处:
然而本文是用于可视化一个已经训练好的卷积网络模型 (展示每一层的特征图),没有学习训练的过程。