cs231n---卷积网络可视化,deepdream和风格迁移

本课介绍了近年来人们对理解卷积网络这个“黑盒子”所做的一些可视化工作,以及deepdream和风格迁移。

 

1 卷积网络可视化

 

1.1 可视化第一层的滤波器

 我们把卷积网络的第一层滤波器权重进行可视化(权重值缩放到0~255之间)可以发现:

第一层的滤波器可以看做模版匹配,那么它寻找的模式就是一些边和线。也就是说,当滤波器滑动到边和线的时候,会有较大的激活值。这跟人脑的功能几乎是一致的。

然而,我们只能可视化第一层滤波器得到如此有意义的结论,可视化后面的滤波器,我们将无法看到什么有用的东西。

 

1.2 研究最后一层

这里的最后一层指的是在输入到最后的得分之前的那一层。

最近邻

左图是我们在像素空间上求最近邻的结果,右图是我们在最后一层产生的特征向量空间上求最近邻的结果。可以看到右边的有些结果,虽然在像素上大有不同,但是却有相同的语义含义。说明卷积网络处理后的特征向量确实包含着语义信息。

t-SNE降维后可视化

还有一种方法是对最后一层产生的特征向量做t-SNE降维(一种非线性降维方法),降到两维。然后在二维坐标系中将这些图片的位置标识出来。具体结果可以看这里:

http://cs.stanford.edu/people/karpathy/cnnembed/  

 

1.3 可视化激活层

有一些研究可视化了中间的激活层(featureMap):

大部分的激活好像都不能看到什么东西,有一个激活很明显的与人脸对应。

 

1.4 产生最大激活值的图片碎片

我们从每层当中选择一个深度切片,然后在CNN上前向传播大量的图片,观察这些深度切片上的神经元的激活值。对每一张图片来说,选取深度切面上激活值最大的那个神经元,并截取这个神经元所能看到的图片区域。然后按照激活值的大小对这些图片区域进行排序。

 

上图中,每一行表示每一个深度切面的排序结果,可以看到一个深度切面确实是在寻找一种相同的模式。并且,高层所寻找的是一种更大的图片结构,这是因为高层的神经元具有更大的感受野。

 

 1.5 “排除”实验

有一项研究通过遮挡图像的某一部分,将这部分替换为平均像素值,然后查看对输出分数的影响,绘制热力图。

可以看到船的主体部分,大象的身体,卡丁车以及赛道都对其具体的分类有较大影响。

 

1.6 Saliency Maps 

我们可以查看输出分数关于输入像素的梯度(也就是哪些像素的改变对于输出分数影响最大)。将梯度取绝对值并缩放到0~255之间,进行可视化:

这也被称为Saliency Maps。 Saliency Maps可以用来做无监督的语义分割(注意,这里事实上还是有监督的,因为产生Saliency Maps的肯定是一个训练好的CNN,只不过我们不需要那些对每个像素都打好标签的图片)。这方面内容可以看看这篇文章:Rother et al, “Grabcut: Interactive foreground extraction using iterated graph cuts”, ACM TOG 2004 

 

1.7 guided backprop

与 Saliency Maps类似,只不过我们这里是看某个特定神经元的激活值关于图片像素的梯度。对梯度可视化的结果如下:

上图我们看到的是(4)中的神经元关于对应的输入图片的梯度。显然,每一个神经元的激活都对图像的一种特定模式特别敏感,印证了我们在(4)中的结论。

 

 1.8 Gradient Ascent 

Saliency Maps 和guided backprop都是前向传播一张特定的图片,然后看输出分数或中间激活值关于输入像素的梯度。

Gradient Ascent则是要找到使得某个激活值最大的输入是长什么样子,即生成一张图片。我们使用的方法是输入一张空白图片,前向传播得到激活值(或得分值),然后反向传播计算激活(得分)关于输入的梯度,然后输入使用梯度下降更新,不断迭代,直到生成一张满意的图片。

这里我们添加了正则项,是为了使得生成的图片更自然。

这里是一些生成的结果:

另外还有一些方法能够使得生成的图片更漂亮,具体可以看CS231n课件。

 

我们可以用Gradient Ascent 的方法来生成对抗样本,步骤为:

生成的对抗样本在人眼上看不出什么差别,但在神经网络看来却会将其错误分类。这确实有点颠覆我们的认知。

更多对抗样本的知识见Ian Goodfellow的讲座。

 

2 DeepDream

deepdream其实就是利用Gradient Ascent来最大化某一层激活的范数,相当于放大这一层学到的特征。具体步骤为:

最后会生成一些很crazy的图片,这里不贴图了。可以看看deepdream的官方博客:

http://googleresearch.blogspot.ch/2015/06/inceptionism-going-deeper-into-neural.html

 

3 风格迁移

在介绍风格迁移之前,先介绍特征反演和纹理生成。

 

3.1 特征反演 Feature Inversion

特征反演是为了查看不同层的特征向量能保留多少原始的图片信息。

任选一张图片,前向传播到已经训练好的CNN。然后选取CNN当中某一层产生的特征向量,记住这个向量。现在,我们要生成一张图片,尽量让它在该层产生一样的特征向量。这个任务仍然是用Gradient Ascent来做,目标函数定义为最小化生成图片的特征向量与给定特征向量的L2距离,并且加一些正则化项保证生成图片的平滑:

用这种方法,我们可以看到不同层的特征向量所包含的信息完整度:

可以看到,在relu2_2层,可以根据特征向量几乎无损地恢复出原图片。但是随着层的深入,神经网络记住的只是图片的线条结构,颜色这些低阶信息开始丢失。

 

3.2 纹理生成 Texture Synthesis 

本节主要介绍目前效果最好的基于深度学习的神经纹理生成方法。注意在这之前有一些传统的方法(最近邻法),这些方法在简单纹理上表现效果可以,但无法处理更复杂的纹理生成。

格莱姆矩阵 Gram Matrix 

将一张图片传入一个已经训练好的CNN,选定其中一层激活,其大小是C*H*W,可以看做是H x W 个C维向量。从这个激活图中任意选取两个C维向量,做矩阵乘法可以得到一个矩阵。然后对激活图中任意两个C维向量的组合,都可以求出这样一个矩阵。把这些矩阵求和并平均,就是Gram Matrix。

Gram Matrix其实是feature之间的偏心协方差矩阵(即没有减去均值的协方差矩阵)。其计算了每个通道特征之间的相关性,考察哪些特征是此消彼长的,哪些特征是同时出现的。我们认为Gram Matrix度量了图片中的纹理特性,并且不包含图像的结构信息。事实上,使用协方差矩阵代替Gram Matrix也能取得很好的效果,但是Gram Matrix有更高效的计算方法:将激活图张量C*H*W展开成C*HW的形式,然后将其乘以其转置,即得到gram矩阵。

神经纹理生成

当我们有了Gram矩阵这一度量图像纹理特性的神器后,就可以使用类似于Gradient Ascent的算法来产生特定纹理的图像。算法流程为:

该算法旨在生成与目标图像具有相同gram矩阵的图像。这里计算的损失是生成图像与目标图像各层gram矩阵的加权L2距离。

效果 

这张图表示,如果以更高层gram矩阵的L2距离作为损失函数,那么生成图像就会更完全地重建图像的空间结构。这是由于更高层的神经元具有更大的感受野导致的。

 

3.3 风格迁移

如果我们结合特征反演和纹理生成,就可以实现所谓的风格迁移。我们需要两张图像,一张图像称为Content image,生成图像需要重建它的空间结构;另一张图像称为Style image,生成图像需要重建它的纹理结构。使用下面的框架完成这个任务:

在这个框架中,我们同时优化特征反演和纹理生成的损失函数(与gram矩阵的距离以及与激活图的距离的加权和),使得生成图既具有Content image的空间结构,又具有Style image的纹理结构。

 

这里有一些超参数,使得我们可以控制生成的图像:

此外,我们可以使用不同风格的gram矩阵的加权和,来生成多风格图:

 

Fast Style Transfer 

上面的风格迁移框架,每生成一张新的图像都需要迭代数次。因此有研究提出了下面的Fast style Transfer的框架:

同样使用特征反演和纹理生成的联合损失函数,更新前馈网络中的参数值。这样,训练好一个前馈网络后,每次生成一个新图像只需要进行一次前向传播即可。

 

posted @ 2018-02-02 09:23  coldyan  阅读(4930)  评论(0编辑  收藏  举报