20170325#cs231n#10.Understanding and Visualizing Convolutional Neural Networks

来源:互联网 发布:js控制div滚动条位置 编辑:程序博客网 时间:2024/05/22 15:21

Visualize patches that maximally activate neurons

这个意思是是把数据输入某一层中,然后看数据的哪一部分最能激活这层的神经元

Visualize the filters/kernels (raw weights)


但对高层的weight可视化的意义就不是特别大了

Visualizing the representation

t-SNE visualization

t-SNE是我们输入一个高维的数据,然后可以根据数据之间的关系进行聚集。

similar things end up in similar places.dissimilar things end up wherever

Occlusion experiments 遮挡实验


这里遮挡块是可以滑动的,对图片中的某一部分作遮挡处理,然后向卷积神经网络输入遮挡过的图片,查看网络将其分为正确类的可能性

如上图中图一中的狗,遮挡块挡住狗的脸部的时候,图片被正确识别的probability就会降低
如上图中图三,正确类为狗。因此如果挡住人脸部,图片被正确识别为狗的概率会大大增加

Visualizing Activations

http://yosinski.com/deepvis
介绍视频:https://www.youtube.com/watch?v=AgkfIQ4IGaM

Deconv approaches

如果要求网络中任意一个神经元对于输入的梯度,那么可以前向传播到这层神经元然后停止,再把这一个神经元Gradient设置为1.00(把这层其他神经元Gradient设置为0),然后再直接从这个神经元进行后向传播,就可以计算得到这个神经元对于输入的梯度

Guided backpropagation

在上图中要先把某层数据进行置0置1.00(方法看上文Deconv approaches部分的文字)然后再使用Guided backpropagation

上图中Guided Backprop对于ReLU,相比于普通的反向传播会改变。
也就是说Guided Backprop会阻断输入的梯度是负的传播。在Guided Backprop只能保留和后向传播正的影响值,所以可视化之后的图片看起来就不会太奇怪,更加清晰

Guided Backprop其实是backprop和deconv的结合体(deconv是如上图中的红框所示)

不过如果单纯使用deconv也有相似的不错的结果

结果如下图


一些例子





Optimization to Image

argmaxISc(I)λ||I||22

找到一个图片 I 使得class c 的score S 的值最大

  1. 如上图所示,输入一个全为0的图片,然后在最末端得到一个score
  2. 对于我们感兴趣的那一个class的score就设置为1,其他的class的score就设置为0,然后用反向传播去发现网络是如何改变这个全为0的图片的(这是普通的反向传播,不做guided backprop也不做有关ReLU层的事)
  3. 设置特定score为1是因为我们只关心感兴趣的梯度信号,用这些梯度信号去更新图片,找到某一个图片能够最大化这个class的score。

这样做是为了更新图片而不是更新weight

Find images that maximize some class score

例子:

Visualize the Data Gradient


上图中的数据梯度在物体所在位置的梯度绝对值比较大。这是每个像素对score的影响的体现。如果改变图二的狗所在位置的像素,那么可能就会对score造成相对比较大的影响。

score与pixel的关系可以由score对这个pixel的Gradient体现
我自己举个例子
例如假设score与pixel成线性关系,那么梯度就是他们之间的scale,如果这个scale也就是梯度比较大,那么pixel变化对score的影响就比较大,也可以说是这个pixel对最后的score贡献比较大


grabcut算法根据梯度信号抽取出图像的一部分

不仅仅对score,可以对网络中任意一个神经元做这种操作

另一种可视化数据梯度的方法

上图是另一种方法。它忽略了正则化,转而是在前向后向的一次小更新的时候对图像做一点blur模糊处理,这就在某种程度上阻止图像在高频区域的积累。

初始化的影响可以看下图(四个方格内代表四种不同初始化)

下图是score对input的梯度

然后是各个layer对input的梯度


这些图像都是表明神经元喜欢”看”什么或者什么东西会让神经元”感兴趣”,也就是说能够最大激活网络中某些神经元的图像(而这些图像是通过optimization得到的,通过前向后向很多次,图像就出现了)

(与上文中deconv不同的是只需要做一次反向就行了)

给定一个某一层的输出特征(也称之为code)能否再现原始的图像

举个例子及:这种操作在于,如果我们只给定最后一层FC层在分类之前的输出结果,我们要通过网络反推出生成这个输出结果的原图


原理就是通过optimization的方法找到一个code输出特征值和已经给定的CNN输出code特征值相似的图片

上图是在给定最后一层FC的输出code时候的重建(复现)

可以看出从最后一层pooling层(也就是在第一层FC之前那层)开始重建效果要远好于从最后一层FC层开始重建

从上图中CONV1的输出特征开始重建和从fc8开始重建的结果是很不一样的。很明显CONV1开始重建与原图很接近。这说明随着卷积神经网络的逐渐进行有信息被逐渐丢掉了。


上图表明即使给定相同的CNN code,也可能有不同的重建结果

Something fun

DeepDream


上文查看某个单独神经元的梯度时候是把梯度设置为1.00,在这里不一样,是直接把Gradient设置为激活数据,也就是dx=x
在这里就是为了寻找一个使得激活更强的图像。

NeuralStyle

[ A Neural Algorithm of Artistic Style by Leon A. Gatys,Alexander S. Ecker, and Matthias Bethge, 2015]
good implementation by Justin in Torch:https://github.com/jcjohnson/neural-style

“fool” ConvNets 欺骗卷积神经网络(adversarial example 对抗样本)


有时候把input作细微的改变/变形,就可以使得网络的预测结果出现变化。如上图中correct→ostrich,把图片沿着ostrich鸵鸟类的梯度方向变化一下,就可能会使正确类变为鸵鸟类


上面两幅图就是把原图混入一点点金鱼分类器的权值,就可以做到使得图片被网络分类为金鱼的概率增加不少

但是实际上在深度学习里面,我们经常会有一些扭动,这可以让我们解决这个问题。不过我们仍然不知道怎么去改变线性分类器。

adversarial example 对抗样本
http://blog.csdn.net/cdpac/article/details/53170940

0 0
原创粉丝点击