一.特征可视化

1.1理解神将网络的层




    下面我们了解一下神经网络内部发生了什么。


第一层:




    第一个卷积层由一个卷积核组成

    在AlexNet中第一个卷积层由许多卷积核组成,每个卷积核的形状是3*11*11,卷积核在图像上来回滑动,我们取图像块和卷积核权重的内积,这就是第一个卷积层的输出。AlexNet中有64个卷积核。

    在第一个卷积层中我们得到了卷积层权重与输入图像像素的内积,我们可以通过简单地可视化得到卷积核权重寻找的东西,来作为图像本身。所以在AlexNet中的3*11*11的卷积核可以看做有3通道的11*11的图像,并且给定红蓝绿值。因为有64个卷积核,所以我们把它看做64个小的3通道的11*11图像组成的大图像。
    右边的三幅图展示了卷积核在寻找的东西,他们在寻找有向边,明暗线条,从不同角度和位置观察输入图像。这些就是学习到的第一个卷积层的权值。
    可视化卷积核权重是为了观察卷积核在寻找什么,这个直觉来源于模板匹配和内积。


   

中间层:




    对中间的卷积层做相同的可视化,他们的可解释性就会差很多。
    经过第一层之后会有一些ReLU和其他一些非线性激活函数。



    第一层输出是16*3*7*7,第二层接收了16个输入,使用20个16*7*7尺寸的卷积核,所以此时不能直接可视化。因为第二层输入图像的深度是16维,我们的卷积核尺寸是16*7*7并且沿着整个深度延伸,我们有20个相同的卷积核来产生下一层的输出。对于一个16*7*7的卷积核,我们把16*7*7的卷积核平面展开成16*7*7的灰度图像,上面的图展示了第二层某个卷积核的权重。




最后一层:




    在最后一层之前有一个全连接层,AlexNet为例,我们有4096维的特征向量来表示我们的图像,然后将其输入到最后一层来预测分类得分。


    通过我们训练的卷积神经网络提取一些数据集来检测一些图像,并为每一个图像标记对应的4096维的向量,并尝试可视化最后一个隐层。




    最邻近方法,左边的图像,我们在第二讲中通过最近邻,在像素空间来寻找近邻(左边的是CIFAR 10数据集中的图像)。
    下面我们在神经网络的4096维向量中计算近邻。
    右边图像的第一列是分类数据集,后面的几列图像是网络输出的4096维向量计算的近邻得出的结果。这跟根据像素空间确定近邻的方法得到的结果非常不同。

    查询一头站在左边的大象,能查到一头站在右边的大象,他们在像素空间上非常不同,所以用像素最近邻可能判断不出来,但是神经网络学习到这两个图像彼此之间非常相近。
    我们把图像输入网络,在网络的最后一个隐层,写出图像的4096维向量,计算图像与网络得到的4096维向量之间的邻近。


降维:



    类似PCA,将4096维向量压缩到二维空间,观察特征空间。
    t-SNE(t分布邻域嵌入)在深度学习常用的可视化特征的非线性降维方法。
    t-SNE的思想:

    有一张图片,得到了关于图片的三个不同信息,图像的像素,图像对应的4096维向量,然后使用t-SNE降维,将4096维向量转化成2维向量,取图像原始像素,把他们放在二维坐标,对应4096维向量的降维版本。 
  

1.2最大激活块





    可视化输入图像中什么类型的图像块可以最大限度地激活不同的特征和不同的神经元,我们选取AlexNet的卷积层,记住AlexNet的每一个激活量提供128*13*13的三维数据,我们选择128通道中的一个,我们通过卷积神经网络运行很多图像,对每一个图像记录他们的卷积特征,可以观察到特征映射图的部分已经被我们的图像数据集最大地激活。

    卷积层中的每个神经元在输入部分都有一些小的感受野,每个神经元的管辖部分并不是整个图像,他们只针对于这个图像的子集合,我们要做的是从这个庞大的图像数据集中,可视化来自特定层,特定特征的最大激活图像块,我们可以根据这些激活块在这些特定层的激活程度来解决这个问题。

    右图是激活特定神经元的输入图像块的实例,这些是最大化激活图像的可视化,我们从神经网络的每一层选择一个神将元,根据从大型数据集中提取的图像对这些神经元进行排序,这会使这个神经元被最大程度地激活,

1.3遮挡实验





    挡住图像的某个区域,把它替换成数据集的平均像素,将被遮挡的图像输入神经网络,记录被遮挡图像的预测分类,将这个遮挡图像块划过输入图像的每个位置,重复相同的过程。然后绘制图像热力图,热力图显示了什么函数作为我们遮挡部分的预测概率输出。
    思想:如果我们遮挡了图像的某个部分,并且导致了神经网络分值的急剧变化,那么这个遮挡的输入图像部分可能对分类决策起到非常重要的作用。

1.4显著图




    给一张狗的图片和它对应的标签,我们想知道图像的哪一些像素对分类的结果影响最大。遮挡是一个方法,显著图从另一个角度来解决这个问题。

    计算机相对于图像像素的预测类别分值,这将告诉我们在一阶近似意义上对于输入图片的每个像素如果我们进行小小的扰动,那么相应分类的分值会有多大的变化。(输入图像的哪一部分的像素对分类会有较大影响)。
    当人们进行语义分割的时候也会运用显著图的方法。在没有任何标签的情况下可以运用显著图进行语义分割。

1.5引导式反向传播

我们不使用类的分值,而是选取神经网络中间层的一些神经元,看图像中的哪些部分影响了神经网络内的神经元的分值。

二.梯度上升

    神经网络相当于一个函数告诉我们输入图像的哪一部分影响了神经元的分值,问题是如果我们移除了图像上的这种依赖性后,什么类型的输入会激活这个神经元。






    我们可以通过梯度上升法来解决这个问题,我们在训练神经网络时总是用梯度下降来使函数损失最小,现在我们要修正训练的卷积神经网络的权值,并且在图像的像素上执行梯度上升来合成图像,尝试最大化某些中间神将元和类的分值。在执行梯度上升过程中,我们不再优化神经网络中保持不变的权重,相反我们尝试改变一些图像的像素使这个神经元的值或这个类的分值最大化,我们还需要正则项来阻止我们生成的图像过拟合特定网络的特性。
    生成图像具备的属性:一.最大程度地激活一些分值或神经元的值,二. 我们希望这个生成的图像看起来是自然的。正则项强制生成的图像看起来是自然的图像。





    一个图像正则化的想法是惩罚生成图像的L2范数。

    除了添加L2范数的约束,还定期在优化过程中对图像进行高斯模糊处理,同时也将一些地梯度的小的像素值修改为0,这是个投射梯度上升算法,我们定期投射具备良好属性的生成图像到更好的图像集中。例如图像在进行高斯模糊处理后获得了平滑性,所以对图形进行了高斯模糊后更容易获得清晰的图像。
    有了更好的正则项,生成的图像会变得更逼真。


三.对抗样本






愚弄网络。

选取一张大象的图像,告诉网络我们想要最大化这张图中考拉的分值,然后我们要做的是改变这张图中大象的形象让神经网络将它归为考拉。




    按照人类直觉来说,如果大象的图片被归为考拉,那么大象的图片将会被改变很多,起码变得要像一个考拉。
    但是右边的第二图大象图被归为考拉,但是在我们看来这两幅图基本一致;同样右边的帆船被归为ipod。


四.DeepDream




    提取我们输入的图像,通过神经网络运行到某一层,接着进行反向传播并且设置该层的梯度等于激活值,然后反向传播到图像并且不断更新图像。

    对于以上步骤的解释:试图放大神经网络在这张图像中检测到的特征,无论那一层上存在什么样的特征,现在我们设置梯度等于特征值,以使神经网络放大它在图像中所检测到的特征。


    这种方法同样可用于最大化图像在该层的L2范数。




    计算梯度之前抖动图像,而不是通过神经网络运行完全和原图相同的图像,这是一种正则化的方法,使得生成的图像更平滑。
除此之外也使用梯度的L1归一化或者修改像素值来进行正则化。





    做完这些以后,小的特征得到了放大。



    出现的图像在向我们传达神经网络训练数据的情况,这是一个图像分类训练的网络,有1000个分类,其中200个是狗,所以生成的图像中出现了很多狗(画风很魔幻)。





       当我们在神经网络的其他层做相同的操作也会得到同样的结果,这里我们只选取神经网路的一个低层,之前的例子在神经网络的较高层,在计算边时神经网络的低层具备可解释性,当在神经网络较低层运行DeepDream这种情况很明显。






    长时间运行DeepDream并且进行多尺度处理,首先用一个小的图像在DeepDream运行,图像变大后继续在DeepDream运行,并且不断重复地执行多尺度处理。


五.风格迁移

5.1特征反演





    选取一张图片,通过神经网络运行该图片,记录其中一个图片的特征值,根据它的特征表示重构那个图像,观察那个重构图像我们会发现一些在该特征向量中捕获的图像类型的信息。

    我们可以通过梯度上升和正则化来做到。与其最大化某些分值,不如最小化捕捉到的特征向量之间的距离,并且在生成图像的特征之间尝试合成一个新的与之前计算过的图像特征相匹配的图像。

全变差正则化:


将左右相邻像素间的差异拼凑成上下相邻,以尝试增加生成图像中特殊的平滑度。




    最左边是原始图像,右边是使用特征反演之后的效果。

    我们通过VGG-16神经网络运行这个图像,记录这个神经网络某一层的特征,然后尝试生成一个与那一层记录的特征相匹配的新图像。这让我们了解到这张图像在神经网络不同层的这些特征的信息存储量。

    例如如果尝试基于VGG-16神经网络的ReLU2_2特征重构图像,可以看到图像被完美重构,即不会丢失该层原始像素的很多信息;但是当我们移动到神经网络的更深处,并且尝试从ReLU4_3
ReLU5_1重构图像,可以看到图像的一般空间结构被保留了下来,仍可以分辨出大象,苹果和香蕉。但是许多低层次的细节并不是原始图像的真正像素值,并且纹理的颜色也和原先不同。这些低层次细节在神经网路的较高层更容易损失。
    我们注意到随着图像在神经网络中层数的上升,可能会丢失图像真实像素的低层次信息,试图保留下来图像的更多语义信息。对于材质和颜色的小的变化它保持不变。


5.2纹理合成

5.2.1传统方法




    给定一张纹理的输入模块,尺寸很小。我们想构建某个模型,使其生成更大块的相同的纹理图像。
    例如我们想生成更大块的相同尺度的更大的图像。
    传统方法:按照扫描线一次一个像素地遍历生成图像,根据已经生成的像素查看当前像素周围的邻域,并在输入图像的图像块中计算近邻,然后从输入图像中复制像素。
    但是当我们使用的是复杂纹理时,直接从输入图像的图像块复制像素的方法可能会行不通。


5.2.2 神经网络合成





    使用了gram矩阵,选取我们输入的石头的纹理,把它传递给卷积神经网络,抽取他们在卷积网络某层的卷积特征,假设我们正在讨论的卷积特征体积是C*H*W,可以把它看成是H*W的空间网格,在网格上的每一点都有C维的特征向量来描述图像在这点的外观。

    我们将会使用激活映射图来计算输入纹理图像的映射符,然后选取输入特征的两个不同列,每个特征列都是C维的向量,然后通过这两个向量得到C*C的矩阵。这个C*C矩阵告诉我们两个点代表的不同特征的同现关系,如果C*C矩阵中位置索引为ij的元素值非常大,这意味着这两个输入向量的位置索引为i和j的元素值非常大。
    这以某种方式捕获了一些二阶统计量,即映射特征图中的哪些特征倾向于在空间的不同位置一起激活。





    我们将使用H*W网格中不同点所对应的特征向量取他们的平均值,那么我们会得到C*Cgram矩阵,然后使用这些描述符来描述输入图像的纹理结构。
关于gram矩阵:
    它丢弃了特征体积中的所有空间信息,因为我们对图像中的每一点所对应的特征向量取平均值,它只是捕获特征间的二阶同现统计量,这最终是一个很好的纹理描述符。
并且gram的计算效率非常高,如果有C*H*W三维张量,可以对他们进行重新组合得到C*H*W,然后乘以它本身的转置矩阵,这些计算都是一次性的。


    使用协方差矩阵同样有效,但是计算成本要高。





    一旦我们有了纹理在神经网络上的描述符,我们可以通过梯度上升来合成与原始图像纹理相匹配的新的图像。这看起来跟我们之前说的特征重构有些类似,但是这不是试图重构输入图像的全部特征映射,而是尝试重构输入图像的gram矩阵纹理描述符。



    人们用纹理图像来训练VGG网络,并计算网络不同层的gram矩阵,然后随机初始化新的图像,接着使用梯度上升,即随机选取    一张图片,使他通过VGG,计算在各层上的gram矩阵,并且计算输入图像纹理矩阵和生成图像纹理矩阵之间的L2范数损失,然后进行反向传播,并计算生成图像的像素值梯度,然后根据梯度上升一点点更新图像的像素,不断重复这个过程,即计算gram矩阵的L2范数损失,反向传播图像梯度,最终会生成与纹理图像相匹配的纹理图像。





    顶部是原始图像,下面是生成的新的纹理图像,通过格拉姆矩阵匹配的纹理合成方法合成的新图像。即计算在前训练卷积神经网络中不同层的gram矩阵,如果我们使用卷积神经网络的较低层,那么通常会得到颜色的斑点,总体的结构并没有被很好的保留下来,下面的图像即在神经网络的较深层计算gram矩阵,他们倾向于更大力度地重建输入图像,这在合成新图像时可以很好地匹配输入图像一般的空间统计量,但是他们在像素上和真实的输入图像本身有很大的差别。





5.3风格迁移




    通过增大gram矩阵做相同的纹理合成算法,毕加索的星空图作为纹理输入图像,然后运行相同的纹理合成算法。


    当把gram矩阵匹配纹理合成方法与特征匹配的反演法结合起来,就形成了风格迁移算法。





    两张图片作为输入,选取其中一张作为内容图像,它将引导我们生成图像的主题,风格图像负责生成图像的纹理和风格。然后共同做特征识别,通过最小化内容图像的特征重构损失,以及风格图像的gram矩阵损失。






    选取内容图像和风格图像,使他们通过神经网络,计算gram矩阵和特征,使用随机噪声初始化输出图像,计算L2范数损失以及图像上的像素梯度,重复这些步骤,在生成图像上执行梯度上升。经过一些迭代后会生成风格迁移后的图像。





5.4快速风格迁移


    之前讨论的风格迁移需要很大的运算量。





    在一开始就修改我们想要迁移的风格,在这种情况下不是为我们想要合成的每个图像运行一个独立的优化程序,而是训练一个可以输入内容图像的前馈网络,直接输出风格迁移后的结果。训练前馈神将网络的方法是在训练期间计算相同内容图像和风格图像的损失,然后使用相同梯度来更新前馈神经网络的权重,一旦训练完成,只需在训练好的网络上进行单一的正向传播。





总结:




    今天用了很多方法来理解CNN,基于近邻,降维,最大化图像块及遮挡图像的激活法,以使在激活值的基础上理解这些特征在寻找什么,基于梯度的方法,使用梯度来合成新图像来理解特征的意义,比如显著图,类的可视化,愚弄图像,特征反演。