CS231N-12-Visualizing & Understanding CNN

来源:互联网 发布:ps软件培训班 编辑:程序博客网 时间:2024/05/21 07:05

  • Visualising CNN
    • Filters First Intermediate
    • Feature Map Last Intermediate
    • Gradient with respect to pixels
  • Gradient Ascent Argmax Input
  • Neural Style Transfer

CNN中间层究竟是什么?现在我们只知道是个黑盒。需要可视化每层的输出,这样才能更好地理解CNN。

What are the intermediate features looking for?

这里写图片描述

Visualising CNN

Filters (First & Intermediate)

这里写图片描述

首先是可视化第一层的卷积核,将64个卷积核一并展示出,这是Pre-trained的经典模型的卷积核。不难发现,都是oriented edges, bars of light and dark, in various angle and position, opposing colors.

这里写图片描述

如上图,再复习下卷积的计算维数。卷积核只有一个参数是固定的,即深度,是上一层feature map的深度,但长宽通常是固定的正方形,卷积核个数是不定的。每个元素的值是Unbounded,但为了可视化,压缩成0到255.
第一层卷积核16*3*7*7,其中3是确定的,三通道的深度,16个卷积核。可视化,分为16个,每个是tensor,tensor的深度向量确定了颜色(三通道),故可以二维的用颜色展示。发现是边缘的bar以及对比色。这很明显。
但是往后层的卷积核随着深度的增加,不再是三通道,如由于第一层的feature map是16层,第二层的深度是16,每个tensor的颜色不可能展示了(不然16通道是什么鬼),只能再拆分16个,这样每个matrix是7*7的单通道,0到255的灰度值(没有颜色的意义),故展现的是一片深浅的灰色。可是可视化的结果并不那么有趣,没什么意义。因为这和上一层的结果以及激活函数有关啊。

Feature Map (Last & Intermediate)

这里写图片描述

再看最后一层,全连接层,FC,假设是10*4096维的矩阵,10个类别,那么输入(也就是最后一个feature map)是4096*1维的向量。我们现在关注这个vector,收集不同照片对应的vector,作kNN(L2范数),得到in feature space的最近邻。发现归类非常好,这远比开始的in pixel space的kNN好多了。这是奇妙的性质?

让我们再从降维(降维为了可视化)的角度看这个feature vector。使用t-SNE(其原理是非线性的,以后再说)技术将4096维降至2维坐标,在二维平面的格点上找最近的对应vector,再把对应的原始图片贴上去,这就绘制成了下下图(失真的铺满)。而下图是exact location,没有最近邻,故显示的是原始的圆形

更多图片见大神的主页。可以发现,图片在二维平面上有很好的聚类cluster,很壮观,这是CNN的厉害之处。

这里写图片描述

这张是中间层的feature map,128slices,每个是灰度图像,好像没啥规律,只有一张(被放大的),和原图很相似。

这里写图片描述

再次复习CNN,feature map里的每一个元素是神经元,我们选取one slice,那么这一片对应的是前面的卷积核遍历后计算的值。注意每一片对应一个卷积核,我们之前知道中间层的卷积核根本就没规律,但是经过卷积核得到的神经元如果被最大激活,是有规律的。我们将一片slice上最大的神经元对应的原图区域排列,就是右边组图。
上面是低层的,使激活的特征很明显,下面是高层的,特征更高了。

Gradient with respect to pixels

这里写图片描述

显著图是计算分类分数向量关于原图每个像素点的偏导数,越大的表明该像素点的微小变化对分数向量有明显影响。按照偏导数大学绘制显著图。可以发现能显示出关键像素。
另外,博士说这是semantic segmentation的另一种方法?没理解…

这里写图片描述

同样地中间层的神经元对原图的像素点求偏导,得到一张图。反映神经元对哪类像素敏感。类似maximally activating patches.

Gradient Ascent: Argmax Input

有趣的是,现在对于固定的CNN,参数全都固定,我们想知道什么样的输入图片会使神经元最被激活f(I),然后加上R(I)正则项。本末倒置2333. 故采取梯度上升,从而得到最大的激活值。

这里写图片描述

这里写图片描述

实际中,我们可以用L2范数作正则项,注意是负数。但这种Naive版本,显示的argmax图片是彩虹色的多种物体…

类似还有Google开发的DeepDream,在原有图片上,生成使某一层神经元激活值最大的小物体,因为pre-trained model用了很多狗,所以照片都是狗头…

略了feature inversion…

Neural Style Transfer

接下来我们看Prisma等美图软件的原理。
先学预备知识。texture synthesis纹理合成。

这里写图片描述

这属于传统计算机图形学范畴,用最近邻算法得到纹理拓展…其实没搞懂最近邻什么?

深度学习采用Gram Matrix来表示风格。针对每层feature map,大小C*H*W,对每一个slice,拉成H*W维向量,共有C个,表示C个卷积核(特征提取器)作用下的表现。然后每两个向量作点乘,得到gram matrix。(对角线为自己的相乘,对称矩阵,参见知乎)。这个矩阵反映了不同feature map之间的关系,这种关系矩阵衡量了风格(建立在feature map是衡量feature)。
参考:
如何用简单易懂的例子解释格拉姆矩阵/Gram matrix?
DeepLearning-风格迁移

这里写图片描述

这里写图片描述

以上就是neural texture synthesis 算法的步骤。用一个pre-trained model如VGG(果然现在pre-trained model又有新的用武之地),分成两个CNN,一个输入是texture(纹理图),另一个输入是我们要学习的生成图片。先用CNN跑一遍texture,得到每层的gram matrix;然后初始化生成图片,跑一遍CNN,得到每层的gram matrix,loss function是对应层的gram matrix的L2范数距离差的加权和,然后loss关于输入x的梯度下降,更新x直到最小值。

注1:要学习出生成图片,都是固定CNN参数,即pre-trained model,求的是关于输入x的偏导,然后梯度下降/上升。
注2:要充分利用feature map,这是特征提取的结果,反映了从微观到宏观的特征。

这里写图片描述
这里写图片描述

做好准备工作后,终于来到正题,Neural Style Transfer 神经网络风格转移 算法。同上,输入一个style image(artwork),输入一个content image(user),生成一个保持style&content的照片。显然这里有个trade-off,style和content的占比取决于用户的喜好,反映在Loss function中的权重:feature reconstruction loss of the content image & gram matrix loss of the style image,content loss和style loss都是针对output image。

注1:这里的feature reconstruction loss of the content image指output image 与 content image的像素L2范数距离差。(但好像课件上是feature空间的距离差?)
注2:用户实现了亲自调整超参数,感受CNN的神奇233.
注3:缺点是CNN太慢了…如同prisma。改进的fast/real-time style transfer没怎么看懂,略。

阅读全文
0 0
原创粉丝点击