文章目录
先不急着到达最精彩的地方,在这之前,让子弹再飞一会。
引言
卷积神经网络能做什么? 不论是图像识别,物体检测,图像分割或是场景重建,CNN早已经在计算机视觉的各种任务上大放异彩。对于CV研究者而言,2012年就像一个分水岭。2012年以前,在CV任务上的研究重点倾向于如何设计更好的人工特征,2012年以后,研究方向发生了180度大转弯,人工特征被渐渐抛弃,取而代之的是越来越复杂,能够提取越来越丰富特征的深度学习算法,其中就包括卷积神经网络。各种论文,实验,竞赛早已证明了CNN在CV任务上的卓越能力。
但是,CNN,或者说深度神经网络却一直有一个通病,那就是同传统的机器学习算法相比,CNN实则是一个黑盒子,传统机器学习算法重在特征工程,人工调参。算法的可解释性强,相比之下CNN网络却一直缺乏合理的可解释性。

可解释性
相较于把可解释性描述为数学上把一个公式通过运用各种定理,加上严谨的推理证明的这一过程,我本人更倾向将可解释性针对于CNN的内部推理机制,而不是CNN的算法本身。(当然算法本身需要调参也比较玄学)
再回到CNN缺乏合理的可解释性上来,也就是说,对于某个任务而言,CNN完成的很出色,但是对于作为人类的我们来说,我们并不知道它到底是如何完成的这么出色的,相反,一个具有可解释性的算法,对于我们而言才是具有借鉴意义的,因为我们能够通过网络到底学到了什么,来有针对性的修改网络的结构,或是辅助人类发现无法观察到的特征。
正是由于CNN的可解释性差,自从AlexNet诞生以来,研究者们对于卷积神经网络的研究就分叉为两个方向,一个致力于挖掘CNN在各种任务上的应用,另一个则倾向于寻找CNN网络的潜在可解释性。
一种途径:特征可视化
最早基于可解释性研究的是2013年的一篇论文Visualizing and Understanding Convolutional Networks。作者将特定卷积层的激活值通过梯度上升的方法,利用反卷积映射回原图大小,从而可视化出不同的卷积核到底学到了什么样的特征表达。通过该可视化方法,作者发现越是底层的卷积学习到的特征越简单,越是深层次的卷积学习到的特征越复杂。
紧随其后,Google在2015年也发布了一个有意思的项目,叫做Deep Dream,即让CNN"做梦",来实现一些有意思的效果。
Deep Dream的原理和论文中的可视化方法相似,通过梯度上升的方法,在反向传播时,更新的是输入图像的参数(左图)而不是网络的参数,通过迭代将卷积某一层的激活值优化到最大,最终得到的结果(右图)在某种意义上就是该卷积核所负责提取的特征:

这里的输入图像可以是任意的,假如我们优化的卷积核恰好负责提取狗的特征,那么优化之后的图像再输入预测网络时,就会被网络大概率的预测为狗,而不是人。因为优化后的图像包含了大量的神经网络所认为的狗的特征。
特征和风格,两者或许是一种东西
对于人类而言,当你看到一幅梵高的画,或是毕加索的画,你一定会一眼就认出来。如果再问你,是依据什么进行判断的,这还不简单,这两位大师的风格明显就不一样嘛。
对于风格迁移而言,算法的核心部分就是如何提取一幅图的风格。这也是其灵魂所在。但事实上,对于风格这种东西,实则是很难通过量化去表达的。传统的风格迁移算法,其原理就是从风格图中提取出某种统计模型,这些模型就代表了图像风格的某种量化表达。但这样基于人工设计的方法耗时又费力。渐渐地,人们发现卷积神经网络天然就具有这方面的能力,因为图像的风格可以表示为图像的一种内在的特征,在风格生成这方面,上述卷积特征可视化的方法就具有借鉴意义。
当然,无论是风格还是特征,它们都有一个统称——图像的纹理(texture)。
图像纹理生成
在2015年的论文 Texture Synthesis Using Convolutional Neural
Networks中,作者就提出了一种通用的算法,可以生成任意图像的纹理,方法也和前面两种类似,都是基于不更新网络参数,只更新初始噪声的梯度上升方法。一个创新之处在于,在如何量化的衡量图像风格这一问题上,作者采用了**格拉姆矩阵(Gram Matrix)**的度量方法。
格拉姆矩阵
在存数学的定义上,格拉姆矩阵被定义为n维欧式空间中任意k个向量之间两两的内积所组成的矩阵:
M G r a m = M T M M_{Gram}=M^TM MGram=MTM
我们知道,两个向量内积的值可以反映这两个向量之间的某种联系,运用在图像风格的度量上,就可以表示两种特征在原图上的“出现程度”以及“共现相关性”。
如果将一层卷积的输出作为输入,那么格拉姆矩阵就可以反映该层卷积提取的特征两两之间的关系:

如上图所示,对于某层卷积的输出,先将每个通道展平成一维张量(reshape成[C, H*W]),作为特征矩阵,再将该特征矩阵和自己的转置相乘,得到的矩阵即为特征矩阵的格拉姆矩阵,格拉姆矩阵是一个对称阵,对角线上的元素代表每个通道特征自己和自己的内积,其余的元素代表不同通道之间的两两内积。
为什么格拉姆矩阵可以反映特征之间的“出现程度”以及“共现相关性”呢,一个普遍且易于理解的解释是,卷积网络不同卷积层下每一个通道的输出实则反映了图像对于某一种特征的激活程度,图像越具有该特征,那么输出的feature map的每一个像素值就越高,将两个不同特征的激活值两两相乘,如果两个特征在原图都有出现并且特别明显,那么相乘得到的值就越高,这时候我们就认为这两个特征的共现相关性就高,相反,如果一个特征在图上比较明显而另一个特征不明显或是两个特征都不明显,那么他们相乘的值就低。这在一定的程度上就可以定义图像的风格或者说纹理。
纹理生成网络

在论文中,作者采用预训练的VGG19(去掉最后用来分类的全连接层)卷积网络来提取图像特征。网络的输入包括一张风格图和一张随机初始化的噪声图。vgg19共有5个卷积Block,在每个Block的输出部分,都会计算一个输出Feature Map的Gram矩阵:
G ^ i j L = ∑ k F ^ i k L F ^ j k L \hat{G}_{i j}^{L}=\sum_{k} \hat{F}_{i k}^{L} \hat{F}_{j k}^{L} G^ijL=k∑F^ikLF^jkL
纹理损失函数
对于每一层的损失,即通过优化风格图的Gram矩阵与初始噪声图的Gram矩阵的L2距离,来使得噪声图与风格图的纹理(风格)尽可能的接近:
E L = ∑ ( G ^ L − G L ) 2 E_{L}=\sum\left(\hat{G}^{L}-G^{L}\right)^{2} EL=∑(G^L−GL)2
有别于梯度下降优化网络参数的方法,在图像纹理生成网络中,VGG19更像是一个先验的Encoder,在训练过程中需要冻结其内部的网络参数,与此相反,随机初始化的噪声图才是梯度下降优化的对象,对于网络的总损失,则是对每一层的损失加权求和:
L ( x ⃗ , x ⃗ ^ ) = ∑ l = 0 L w l E l \mathcal{L}(\vec{x}, \ha

本文介绍如何使用卷积神经网络(CNN)进行风格迁移,并探讨CNN的可解释性。文章涵盖特征可视化、图像纹理生成及风格迁移的实现方法,并提供详细的Torch代码实例。

4373

被折叠的 条评论
为什么被折叠?



