cs231n Visualizing and Understanding 理解


最近回顾了cs231n中关于可视化的内容,根据PPT和视频内容整理一下自己的理解。从网络输入层的卷积核和中间层的特征可视化开始到基于梯度提升方法的特征匹配、特征反演等方法,进而衍生出了Deepdream以及前几篇博客介绍的风格迁移的技术。
在这里插入图片描述

First Layer: Visualize Filters

第一种方法是可视化神经网络第一层的卷积核,也就是训练好的卷积核中的权重w值。
在这里插入图片描述
如上图所示,AlexNet的第一层有64个尺寸为11x11x3的卷积核,我们把训练好的每一个卷积核看作一个11x11的三通道图片(权重值w缩放到0~255),排列成8行8列就成为了最左边的大图。这些图展示了卷积核在寻找的东西,即他们在寻找有向边,明暗线条(因为卷积核滑动到边和线的时候,会有较大的权重,这意味着对这些内容能产生更高的激活值),这些就是学习到的第一个卷积层的权值。可视化卷积核权重是为了观察卷积核在寻找什么,这个直觉来源于模板匹配和内积。
在这里插入图片描述
对卷积核的可视化也可以在其他层上进行,但是可解释性会差很多。因为第一层卷积是直接对人类能理解的原图片进行的处理,可视化出的线条和边是原图中的特征,而之后层的输入就已经是网络自己提取出来的feature map了,也就是说可视化中间层卷积核的结果实际上是可视化了原图特征的特征,是人类不能从视觉上理解的内容。

Last Layer

在这里插入图片描述
对于ImageNet来说,Last Layer就是指在最终输出1000个类别之前经过全连接层得到的4096维特征向量,对这个特征向量可视化有两种方法。

Nearest Neighbors

在这里插入图片描述
上图左边展示了ciffa-10数据集中在像素空间上使用最近邻找出的相似图片,可以看出相似的图片基本上有着相似的轮廓和内容,但是也会把蛤匹配到有着相同姿势的猫上。而右边则是在4096维特征空间上使用最近邻找出的相似图片,可以发现图片之间的像素会有较大差异,但是在语义特别是类别上有很大的相似性,这也说明了神经网络学习到的特征确实包含了大量的语义信息。

Dimensionality Reduction

在这里插入图片描述
另外一种特征可视化的方法是降维,把4096维特征映射到2维上,然后根据这2维建立一个坐标系,在平面坐标系上很容易看到哪些特征之间接近,哪些特征距离较远。上图右侧展示的是在手写体数据集mnist上,把28x28的图片拉伸为特征向量,然后降到2维,在平面坐标系上可以看出来,具有相似特征的同一种数字被聚到了一起。
这里主要是使用了t-SNE(t-distributed stochastic neighbor embedding)的降维方法,高维到低维的映射存在一个难点:高维距离较近的点在低维可能比较方便聚集在一起,但是高维上距离较远的点比较难在低维上拉开距离。t-SNE的主要思想是:将高维分布点的距离,用条件概率来表示相似性,低维分布的点也用同样的方法表示,只要二者的条件概率非常接近(用相对熵计算),说明高维分布的点已经近似的映射到低维分布上了。具体想了解的可以自行百度,只需要知道它是一种降维的方法就行了,保留了不同特征的空间相对关系。
在这里插入图片描述
上图就是把图片提取的特征降到2维,然后在平面坐标上放入特征代表的原始图片后的结果,也就是说特征空间上距离较近的图片应该在坐标轴上也是接近的。可以在这个链接上看一下高清的原图:See high-resolution versions,从结果上看和第一种方法是类似的,高层的语义相近的图片会被聚到一起。

Visualizing Activations

可视化中间层的权重解释性并不是那么强,但是可视化中间层的激活值也就是feature map,在某些情况下是具备可解释性的。
在这里插入图片描述
上图把一个128x13x13的feature map看作128张13x13的灰度图并可视化了结果,这可以告诉我们卷积神经网络要寻找的特征在输入中是什么类型的。
从上图可以看出大部分中间层特征都有很多的干扰,不能直观理解。但是这里有一个突出的中间层特征(绿色方框),输入图片的下方是把它放大的结果,看起来是个人脸的形状,似乎在激活对应人脸的特征映射图部分。

Maximally Activating Patches

可视化输入图像中什么类型的图像块可以最大限度地激活不同的特征和不同的神经元。
在这里插入图片描述
如上图,对于一个128x13x13的feature map,128个通道数其实是通过128个不同的卷积核对上一层进行卷积得到的结果,我们选择128个通道中的一个,也就是只看某一个卷积核产生的激活值。测试很多不同图片,记录它们在该通道,即该卷积核上产生的激活值,也就是13x13个激活值,找出最大的激活值,然后根据感受野在原图上截取其对应的图像块。根据右侧的结果可以看出,特定的卷积核会对于特定的内容产生较大的激活值,而且选取所在层数越深的卷积核,对应的特征更高级,因为会有更大的感受野。

Occlusion Experiments

在这里插入图片描述
遮挡住图像的某个区域,把它替换成数据集的平均像素,并将这个遮挡块划过输入图像的每个位置,分别绘制对应的图像热力图,热力图显示了我们遮挡不同部位时的预测概率输出,如果遮挡住某个区域时,对热力图影响剧烈,则说明这一块对分类决策起到非常重要的作用。(比如汽车的轮子,人和动物的脸)

Saliency Maps

显著图和遮挡测试类似,给出一只狗的输入图像,以及狗的预测类标签,我们想要知道输入图像中的哪部分像素对于分类是重要的。
在这里插入图片描述
主要思路是:查看输出分数关于输入图像的像素的梯度(哪些像素的改变对于输出分数影响最大),将梯度取绝对值并缩放到[0,255]之间可视化。如上图,GrabCut是一种分割算法,当将其与显著图结合起来时,我们可以细分出图像中的对象,实现无监督的语义分割。

Intermediate Features via (guided) backprop

在这里插入图片描述
引导式反向传播,我们不使用类的分数值,而是选取神经网络中间层的一些神经元,看图像中的哪些部分影响了神经网络内的神经元的分值,仅传播正梯度,仅需跟踪整个神经网络正面积极的影响。上图的右侧展示了几种反向传播的梯度策略,反向传播经过Relu层时,输入为负数,也就是激活值为0的位置梯度也会变为0;在deconvnet中,会对负梯度进行截断,将其置为0;而引导式的反向传播则是综合了两张方法,同时把激活值为0和梯度为负的位置都进行梯度截断,将其置为0,该位置将不再继续进行反向传播,效果如下:
在这里插入图片描述
在这里插入图片描述

Gradient Ascent

之前的方法都是在固定输入图片的条件下,对寻找图片的哪一部分可以使神经元产生更大的激活值,而梯度上升则是把输入图片I作为变量,以最大化某一层神经元的激活值为目的,去优化并合成图片I。
在这里插入图片描述
具体的做法也很简单,
在这里插入图片描述
我们需要把初始图像初始化为0,或是添加高斯噪声,然后重复进行前向传播并计算当前分数值、通过反向传播计算相对于图像像素的神经元值的梯度、对图像像素执行一个小的梯度下降或上升的更新,以使神经元分数值最大化,直到我们生成了一幅最终的图像。
右上角公式的第一部分希望最大程度地激活一些分数值或神经元的值;第二部分希望这个生成的图像看起来是自然的,即我们想要生成的图像具备在自然图像中的统计数据,L2正则项强制生成的图像看起来是自然的图像。效果如下:
在这里插入图片描述
在这里插入图片描述
解决问题的另一个角度是通过改进正则化来改善可视化图像。除了L2范数约束外,我们还定期在优化过程中对图像进行高斯模糊处理,同时也将一些低梯度的小的像素值置0。可以看出这是一种投影梯度上升算法,定期投影具备良好属性的生成图像到更好的图像集中。例如,进行高斯模糊处理后,图像获得特殊的平滑性,更容易获得清晰的图像。
在这里插入图片描述
优化函数不仅可以选择最后一层的分数值,也可以对中间结果的激活值进行最大化,效果如下:
在这里插入图片描述

Fooling Images / Adversarial Examples

在这里插入图片描述
之前的最大值优化都是在分类结果之前选取的,如果选一张大象图片,然后选取另外一个考拉作为类别,我们从最终的类别开始反向传播,希望网络能够把大象判别为考拉去优化输入图片。你可能觉得这头大象会像一只考拉转变,有可爱的耳朵,但是实际上并不是如此。如果你提取这张大象的图像,然后告诉神经网络它是考拉,并且尝试改变大象的图像,你将会发现生成的图像被归类为考拉,但是它在人眼看来仍是一只大象,甚至和之前几乎没有变化,如下图:
在这里插入图片描述
新生成的图片从人眼和神经网络中得到了完全不一样的结果,只是增加了一些噪声,就会得到一个非常高置信度的错误判断,这样的图片也被叫做对抗样本。
对抗样本存在的依据主要是在前向传播用到函数的线性特性,这些线性特性使得网络难以覆盖所有的数据空间。就图像问题来说,一张256x256灰度图的维度能达到65536,而实际训练中的真实图片都具有特殊的统计结构,会受到很小一部分空间的约束,训练出的图片在这个小空间内的效果很好,而大多数测试自然图片也都在这个小空间内。对抗样本在每个维度上可能只是进行了一个很小的改变,人眼难以看出这个改动,可是在上万个维度上小改动,使得图片偏离了网络训练时的小空间内,从而对输出产生巨大的影响。

DeepDream

在这里插入图片描述
主要是把所选择层的激活值直接作为该层的梯度,从而放大网络检测到的特征。
在这里插入图片描述
A couple of tricks:
计算梯度之前抖动图像,即不是通过神经网络运行完全和原图像相同的图像,而是将图像移动两个像素,并将其他两个像素包裹其中,这是一种正则化方式,以使图像更加平滑;
使用梯度的L1归一化;
有时候修改像素值;
在这里插入图片描述
这样生成的图片就是网络认为这个类别最应该具有的样子,看起来很梦幻,所以叫做DeepDream。

Feature Inversion

思路就是根据特征对图片进行重构:
在这里插入图片描述
选取一张图像,通过神经网络运行该图像,记录其中一个图片的特征值,然后根据它的特征表示重构那个图像,观察那个重构图像我们会发现一些在该特征向量中捕获的图像类型的信息。
我们可以通过梯度上升和正则化来做到。与其最大化某些分数值,不如最小化捕捉到的特征向量之间的距离,并且在生成图像的特征之间尝试合成一个新的与之前计算过的图像特征相匹配的图像。
一个经常见到的正则化是全变差正则化,全变差正则化将左右相邻像素间的差异拼凑成上下相邻,以尝试增加生成图像中特殊的平滑度。
在这里插入图片描述
左边是原始图像,我们通过VGG-16运行这个图像,记录这个神经网络某一层的特征,然后尝试生成一个与那层记录的特征相匹配的新图像,这让我们了解到这张图像在神经网络不同层的这些特征的信息存储量。例如当我们尝试基于VGG-16的relu2-2特征重构图像,可以看到图像被完美地重构,即不会真正丢弃该层原始像素的许多信息。但是当我们向上移动到神经网络的更深处,尝试从relu4-3、relu5-1重构图像,可以看到图像的一般空间结构被保留了下来,但是很多低层次的细节并不是原始图像真实的像素值,并且纹理的颜色也和原来不同。这些低层次的细节在神经网络的较高层更容易损失。
这让我们注意到随着图像在神经网络中层数的上升,可能会丢失图像真实像素的低层次信息,并且会试图保留图像的更多语义信息,对于类似颜色和材质的小的变化,它是不变的。

Neural Texture Synthesis: Gram Matrix

这里后面关于neural style的介绍可以看之前的博客Neural-style-tf

由于神经网络内部基本算是一个黑箱子,所以可视化的工作无论对于更好理解神经网络的原理还是更好的改进网络结构都具有极高的意义。

主要参考的博客:
https://blog.csdn.net/qq_29176963/article/details/82961961#Fooling_Images__Adversarial_Examples_115

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值