ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)


❤ 文章有点长,可以收藏一下慢慢看哦 ~

提出本模型的论文:

Visualizing and Understanding Convolutional Networks


一、写在前面的话


1. 为什么神经网络能够表现这么好?

仅靠一个理论上的自学习和一个理论上的多参数和一个理论上的非线性分类是无法令人们满意的。神经网络的黑盒子特性也让充满好奇心的机器学习学者们拼命想解开神经网络的秘密。在解密神经网络的庞大队伍中的重要分支是想要利用可视化等技术来对神经网络一探究竟,其中 Z 和 F 二人 开篇性的找到了将卷积核可视化的一种可行的方式。中南大学赵颖老师带领的可解释机器学习项目也加入其中,从此……


2. ZFNet 仅仅是在 AlexNet 上做了一些调参:

改变了 AlexNet 的第一层,即将滤波器的大小 11x11 变成 7x7,并且将步长 4 变成了 2(就这么一丁丁操作就改变了整个卷积神经网络的性能,并在2013年ImageNet大赛中夺冠)

========== 对比图:上为 AlexNet,下为 ZFNet ==========
ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第1张图片
3. ZFNet 凭什么将 11 改成 7,将步长减 2,是盲目调参吗?

显然发了这篇论文肯定是有自己的一个调参方法——根据可视化结果判断模型的效果,并可以确定一定的优化调参方向

========== 对比图:==========

ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第2张图片

4. 当然这篇论文还根据遮挡图像的局部对分类结果的影响来探讨了对分类任务而言到底哪部分输入信息更重要



二、ZFNet 中做出的改进,以及 Z 和 F 在神经网络可视化方面的独到见解


首先肯定是看看可视化神经网络的方式

(1)可视化什么东西: 卷积层提取出来的特征图像。
(2)如何可视化卷积核提取出来的特征图像?

复习 :

每一层的基本操作是 : 卷积 -> relu -> 池化 -> 归一化

卷积操作:
ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第3张图片池化操作:ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第4张图片
思考: 看到这里每一层的基本操作之后,如果我们想要可视化一下输出的图片是不是挺好?那能直接转变成像素图片进行可视化吗?或者是进行一些什么样的操作?

Z和F的思考: 截取最终模型的池化层的输出,然后反池化,“反relu”,反卷积,将得到的图片进行展示。 如下图:
ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第5张图片
问题1:是对任意一个输入的图片的任意一层的任意一个卷积核的卷积出来的结果进行该操作然后展示吗?

显然不是,因为一张狗的图片对于一个可以提取人脸信息的卷积核是提取不到有用的信息的。那么在选用图片的时候选择一个能让该卷积核激活最大化的图片作为输入就可以了。( 激活最大化可以理解为:这张图片里面的某一特征正好可以被该卷积核完美的提取出来。官方解释论文还未阅读 )


问题2:为什么不从截取归一化的操作进行反归一化然后反池化……

在已经训练出来神经网络模型之后,通过输入图片一层一层的正向传播最终的到输出,而归一化的主要作用是限制每一层的输出范围,提取特征的任务主要交给卷积、激活 和 池化操作。况且归一化也确实不好进行逆向计算。


问题3:如何反池化? 如何“反relu” ? 如何反卷积(转置卷积)?

这两个人开创性的想到:

① 反池化: 利用一组转换变量switch在每个池化区域记录最大值的位置来确定最有效的特征值的位置。那么就可以将池化后的输出Pooled Map 按照 switch 记录的位置填回去喽。

ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第6张图片

② “反relu”: 根据 y 求 x 喽 ,又因为 y = max(x) ,经过pooling后大概率是正数 ,那么就 x = y 呗,如果 y = 0 的话信息已经丢掉了也没法弥补x= 0。(我的理解 这里论文没有讲述)

③ 反卷积: 大数学论证,(由卷积之后获得的特征值获得原图像大小的数据分布)简单的说就是存在一种技术让下图中的 5×5 的像素经过卷积之后得到的 3×3 输出,经过一系列变换 ,再变回 5×5 的像素排列(尽管会有部分数据损失,但是也没办法,此技术不为论文重点,作者也是直接用的该技术)。

========== 例子1 ==========
卷积:
ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第7张图片
反卷积:
ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第8张图片
反卷积中的 padding stride 卷积核大小的确定:

P反 = 卷积核大小 - P正 - 1,图中为(3-0-1=2)
Stride反 = stride的倒数, 那么就用填充 0 来表示倒数卷积核大小与正卷积核大小相同

========== 例子2 ==========
卷积:
ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第9张图片
反卷积:
ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第10张图片
Padding = 3 -1 - 1 = 1
Stride = 1/2 相当于填充一个白格子



三、结果

根据该方法可以在一定程度上可视化得到卷积层中每个卷积核提取出来的特征。


发现1:由上图可以看到:
① 第二层应对角落和其他边缘或者颜色的结合;
② 第三层有更加复杂的不变性,捕捉到了相似的纹理;
③ 第四层显示了特定类间显著的差异性;
④ 第五层显示了有显著构成变化的整个物体。


发现2:模型的底层在少数几个 epoches 就能收敛聚集,然而上层在一个相当多的 epoches (40-50) 之后才能有所变化,这显示了让模型完全训练到完全收敛的必要性

可以由下图看到颜色对比度都逐步增强:
ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第11张图片

发现3: 特征不变性:一般来说,小的变化对于模型的第一层都有非常大的影响,但对于最高层的影响却几乎没有。对于图像的平移、尺度、旋转的变化来说,网络的输出对于平移和尺度变化都是稳定的,但却不具有旋转不变性,除非目标图像时旋转对称的。

下图为分别对平移,尺度,旋转做的分析图:

分析: 上图按行顺序分别为对5类图像进行不同程度的垂直方向上的平移、尺度变换、旋转对输出结果影响的分析图。按列顺序分别为原始变换图像,第一层中原始图片和变换后的图片的欧氏距离,第7层中原始图片和变换后的图片的欧氏距离,变换后图片被正确分类的概率图。


思考:到现在,我们一直存在一个疑问:
模型可以根据一个图片提取出来不计其数的特征,尤其是卷积操作还是平移着一部分一部分地尝试提取特征的,哪个特征最有效? 一张狗的图片中顶多一部分是狗对吧,不可能贡献一般大的。那么图片中的哪个部分贡献最大?



四、其他一

该论文还描述了通过 <遮挡实验> 来确定一张图片中最重要的部分是哪( 通过哪一部分得出的相应结果 )。

1、方法: 用一个灰色小方块来挡住图像中的目标,然后再观测输出的分类情况来分析。

2、结果:

ZFNet 详细解读(Visualizing and Understanding Convolutional Networks)_第12张图片
上图为对三个不同的测试图片中的不同位置用灰色小方块进行掩盖后,观测分类输出的改变情况。

第一列(a)为原始测试图片;
第二列(b)为某个区域被灰色小方块掩盖后的网络结构中第五层的特征图;
第三列(c)为将第五层的特征图投影到输入图像的可视化图像;
第四列(d)为正确分类概率的图;
第五列(e)为最有可能的标签。

第一行表明最强烈的特征表现在狗狗的面部区域。

上述结果表明,如果图像中的目标被遮挡,那么被正确分类的概率会显著降低,这表明这种可视化与激发特征图的图像结构式真正对应上的。即大概能知道位置。

思考:如何利用可视化来优化参数?



五、其他二

通过判断提取出来的特征是否有效,失效在什么地方?来决定自己的参数优化趋势。

发现: 原有的 AlexNet 中提取出来的特征因为 卷积核太大,池化部分步长设置过大 导致是 有一部分失效的所以减小第一层卷积核大小11->7 池化步长4->2



六、启发

盲目调参费时费力,充分挖掘神经网络可视化的方法有助于我们进一步地打开神经网络这个黑匣子。

你可能感兴趣的:(神经网络学习之路分享)