2017CS231n李飞飞深度视觉识别笔记(十二)——可视化和理解卷积神经网络

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34611579/article/details/81264334

第十二讲 可视化和理解卷积神经网络

课时1 特征可视化、倒置、对抗样本

    上一章中计算机视觉中一些内容,包括图像分割、检测以及识别;这一章中将讨论卷积神经网络的内部真正的工作原理是什么。

    第一层:由许多卷积核组成,每个卷积核是11*11*3,这些卷积核在输入图像上来回滑动,取图像块和卷积核权重的内积,这就是第一层的输出;可以把这个卷积核看成有3个通道的形状为11*11的图像,并且给定红色、绿色、蓝色的值,如图所示的第一层的可视化:

    可以看到卷积核正在寻找什么,它们都在寻找有向边,比如明暗线条,从不同的角度和位置来观察输入图像,可以看到完全相反的颜色。

    中间层:如果对中间的层进行相同的可视化,但是实际上它的解释性会差很多,第二层的权重经过卷积之后,这里有一些ReLU激活函数和一些其他的非线性激活函数,但不能从卷积核权重里面得到太多的信息,这里的做法是可以把卷积核平面展开成灰度图像;这些灰度图像显示了第二层某个卷积核的权重。

    对于可视化中间层的特征,可以做一件每场有用的事情是可视化输入图像中什么类型的图像块可以最大限度地激活不同的特征、不同的神经元;这里的做法是选取AlexNet的卷积层,记住每一个激活量提供了128*13*13的三维数据,然后选择128个通道其中的一个,通过神经网络运行很多图像,对于每个图像记录它们的卷积特征,可以观察到那个特征映射图的部分已经被图像的数据集最大地激活,然后对这些最大化激活的图像块进行可视化。

    最后一层:神经网络的最后一层通过大概1000个类的得分来得到数据集中每个类的得分,而在最后一层之前通常有一些完全连接的层,以AlexNet为例,用4096维的特征向量来表示图像,将其输入到最后一层来预测最终类的得分;可以用近邻算法可视化最后的结果。

    从另一个角度来看最后一层到底发生了什么,通过降维的方法,比如PCA可以让你把像4096维的特征向量的高维表示压缩到二维空间,以便能更加直观地可视化这个特征空间;还有一种强大的算法叫t-SNE,即t-分布领域嵌入,它是人们经常在深度学习里面可视化特征的非线性降维方法,如下图的实例:

    这里的可视化显示了mnist数据集上的t-SNE降维,(mnist是手写的0-9之间的数字构成的数据集),每个图像都是28*28的灰度图像,使用t-SNE把28*28维的原始像素特征空间作为mnist,现在把它压缩到2维,在这个压缩的二维表示中可视化每个mnist数据。

    所以可以在训练图像网络分类器最后一层的特征上应用t-SNE降维技术,记录每个图像在最后一层的4096维的特征向量,通过t-SNE降维方法把4096维的特征空间压缩到2维特征空间,在压缩后的2维特征空间中布局网格,观察网格中的每个位置会出现什么类型的图像,通过这种方法可以粗略感受到学习到的特征空间的几何结构是什么样子的。

    下面介绍有个有趣的实验:排除实验。

    我们想要做的是弄清楚究竟是输入图像的哪个部分导致神经网络作为了分类的决定;如下所以遮挡某个区域的某个部分:

    然后把它替换成数据集的平均像素值,通过神经网络运行被遮挡的图像,然后记录遮挡图像的预测概率;现将这个遮挡图像块划过输入图像的每个位置,重复相同过程,绘制图像的热力图,作为图像遮挡部分的预测概率输出。

    这个想法是如果遮挡图像的某个部分并且导致了神经网络分值的急剧变化,那么这个遮挡的输入图像部分可能对分类决策起到非常重要的作用。

    另一个相关的概念是显著图,即给出输入图像以及预测类标签,想要知道输入图像中的哪部分像素对于分类时重要的,遮挡是解决这个问题的一种方法,但是显著图从另一个角度解决这个问题。

    传导式反向传播的思想也可以告诉我们图像块的哪个部分影响了神经元的分值。

    关于传导式反向传播或计算显著图的意见有趣的事情是总有一个固定输入图像的函数,这个函数告诉我们对于一个固定输入的图像,输入图像的哪个像素或者哪个部分影响了神经元的分值;那么如果在一些输入图像上移除这种依赖性,什么类型的输入会激活这个神经元,这里可以使用梯度上升法:

    总是在训练卷积神经网络时使用梯度下降来使函数损失最小化,而现在想要修正训练的卷积神经网络的权重,并且在图像的像素上执行梯度上升来合成图像以尝试最大化某些中间神经元和类的分值。在执行梯度上升的过程中,不再优化神经网络中保持不变的权重,相反试图改变一些图像的像素使这个神经元的值或这个类的分值最大化,会加入一些正则化项强制生成图像看起来像是自然图像的东西。

    一般的策略

   (1)把初始化图像为0或者通过添加高斯噪声来进行图像去噪;

  (2)然后通过3D神经网络重复转发图像并计算感兴趣的神经元分值;

  (3)通过反向传播来计算相对于图像像素神经元分值的梯度,对图像像素本身执行一个小的梯度下降或者梯度上升更新以使神经元分值最大化;

  (4)不断重复上述步骤直到拥有一个漂亮的图像。

课时2 DeepDream和风格迁移

    另一件可以做的基于梯度的图像优化是DeepDream,它的思想:提取输入图像通过神经网络运行到某一层,接着进行反向传播并且设置该层的梯度等于激活值,然后反向传播到图像并不断更新图像,它的实现如下:

    Deepdream的展示:

    另一件可以做的非常有用的事情是特征反演,这让我们再次了解到神经网络的不同层可以捕获图像的哪些类型的元素。

    我们需要做的是选取一张图像,通过神经网络运行该图像,记录其中一个图像的特征值,然后根据它的特征表示重构那个图像,基于重建图像的样子这将给我们一些关于在该特征向量中捕获的图像类型的信息,可以通过梯度上升和正则化来做到这点,与其最大化某些分值,不如最小化捕获到的特征向量之间的距离,并且在生成图像的特征之间尝试合成一个新的与之前计算过的图像特征相匹配的图像;这里用到了全变差正则化将左右相邻像素之间的差异拼凑成上下相邻以尝试增加生成图像中特殊的平滑度。

    下面给出了特征反演在不同的神经网络中的可视化效果:

    这是一种非常酷的风格转移,除了理解风格转移以及特征反演,还需讨论一个相关的问题:纹理合成。

    纹理合成在计算机图形学中是个老问题,比如给定一些纹理的输入图像块,想要构建某个模型以使其生成更大块的相同的纹理图像。

    为了在神经网络上进行纹理合成,使用格拉姆矩阵,在如下的实例中,选取输入的石头纹理,把它传递给卷积神经网络,抽取它们在卷积网络某层的卷积特征。

    假设卷积特征体积H*W*C,可以把它看成H*W的空间网络,在网格上的每一点都有C维的特征向量来描述图像在这点的外观,然后用激活映射图来计算输入纹理图像的映射符,选取输入特征的两个不同列,每个特征列都是C维的向量,通过这两个向量得到C*C的矩阵,使用H*W网格中不同点所对应的特征向量取它们的平均值,得到C*C的格拉姆矩阵;这最终是一个很好的纹理描述符。

    一旦有了神经网络上进行纹理合成,就可以通过梯度上升来合成与原始图像纹理相匹配的新的图像。

    实验的效果图:

    当把格拉姆矩阵匹配的纹理合成方法与特征匹配的特征反演法结合起来会产生非常棒的风格迁移算法;在风格迁移中,把两张图像作为输入图像,第一步选取其中一张图像作为内容图像,它引导我们生成图像的主体,同样的风格图像负责生成图像的纹理或风格,然后共同做特征识别,通过最小化内容图像的特征重构损失以及风格图像的格拉姆矩阵损失,就能得到非常棒的图像。

    但是风格转移算法有一个问题,即风格迁移算法的效率非常低,为了生成新图像,需要通过训练神经网络计算大量的正向传播和反向传播,特别是为了生成高分辨率图像;解决方法是训练另一个神经网络来进行风格迁移的工作。

    总结:

    提到了很多方法来理解CNN以及一些基于近邻,降维,最大化图像块以及遮挡图像的激活法以使在激活值的基础上理解这些特征在寻找什么;也讨论了一些基于梯度飞方法,可以使用梯度来合成新图像来理解特征的意义。

 

猜你喜欢

转载自blog.csdn.net/qq_34611579/article/details/81264334
今日推荐