来源:Coursera吴恩达深度学习课程
神经风格迁移(neural style transfer)是神经网络一个有意思的应用,要构建一个神经风格迁移系统,需要为生成的图像定义代价函数(cost function)。上一篇文章定义了内容代价函数(Content cost function),这篇文章我们来了解风格代价函数(style cost function)。
你有这样一张彩色图片,现在你选择了某一层l(蓝色框部分)去为图片的风格定义一个深度测量(deep measure),现在我们要做的就是将图片的风格定义为l层中各个通道之间激活项的相关系数(correlation)。如何知道这些不同通道之间激活项的相关系数呢?
如上图,将不同的通道渲染成不同的颜色(这里假设有5个通道(channels),将它们染成了五种颜色)。一般情况下,在神经网络中会有许多通道。在第一个通道中含有某个激活项,第二个通道也含有某个激活项,于是它们组成了一对数字。同理,可以得到很多数字对(pairs)。
看这个例子,这个红色的通道对应的第2个神经元,它能找出图片中的特定位置是否含有这些垂直的纹理,而第二个通道也就是黄色的通道,对应第4个神经元,它可以粗略地找出橙色的区域。
什么时候两个通道拥有高度相关性呢?如果它们有高度相关性,那么这幅图片中出现垂直纹理的地方,那么这块地方很大概率是橙色的。如果说它们是不相关的,又是什么意思呢?显然,这意味着图片中有垂直纹理的地方很大概率不是橙色的。而相关系数描述的就是当图片某处出现这种垂直纹理时,该处又同时是橙色的可能性。
相关系数这个概念为你提供了一种去测量这些不同的特征的方法,比如这些垂直纹理,这些橙色或是其他的特征去测量它们在图片中的各个位置同时出现或不同时出现的频率。
如果我们在通道之间使用相关系数来描述通道的风格,你能做的就是测量你的生成图像中第一个通道(红色)是否与第二个通道(黄色)相关,通过测量,你能得知在生成的图像中垂直纹理和橙色同时出现或者不同时出现的频率,这样你将能够测量生成的图像的风格与输入的风格图像的相似程度。接下来我们证实这种说法。
如上图,对于这两个图像(风格图像S和生成图像G),需要计算一个风格矩阵(style matrix),说得更具体一点就是用l层来测量风格。其中a^[l]_i,j,k表示隐藏层l中(i,j,k)位置的激活值,i,j,k分别表示该位置的高度、宽度以及对应的通道数。计算一个关于l层和风格图像的矩阵,即G^[l][S],这是一个n_c*n_c的矩阵,这个矩阵的高度和宽度都是l层的通道数。矩阵中的k和k'被用来描述k通道和k'通道之间的相关系数。矩阵具体表现为:
解释:用符号i,j表示下届,对i,j,k位置的激活值乘以同样位置的激活值,然后i和j分别加到l层的高度和宽度。严格来说,它是一种非标准的互相关函数(unnormalized cross-covariance),因为我们没有减去平均数,而是将它们直接相乘。这是输入的风格图像构成的风格矩阵,然后对生成图像G做同样的操作:
风格矩阵就是把图中各个高度和宽度的激活项都遍历一遍,并将k和k'通道中对应位置的激活项都进行相乘。现在我们有两个矩阵,分别从风格图像S和生成图像G得到。过程见下图:
最后,上图所示,将S和G代入到风格代价函数中去计算,得到这两个矩阵的误差,这里用的Frobenius范数,实际上是计算两个矩阵对应元素相减的平方的和。把这个式子展开,从k和k'开始作差,然后把所有的结果加起来,作者使用了一个归一化常数(renormalization constant),再在外面加一个平方,但是一般情况下你不用写这么多,一般我们只要将它乘以一个超参数beta就行。
如上图,最后,这是对l层定义的风格代价函数J^[l],实际上,如果你对各层都使用风格代价函数,会让结果变得更好。如果要对各层都使用风格代价函数,你可把各个层的结果(各层的风格代价函数)都加起来,对每个层定义权重,也就是一些额外的(extra)超参数,用lambda^[l]表示。这样将使你能够在神经网络中使用不同的层,包括之前的一些可以测量类似边缘这样的低级特征的层,以及之后的一些能测量高级特征的层,使得我们的神经网络在计算风格时能够同时考虑到这些低级和高级特征的相关系数。这样,在基础的训练中你在定义超参数时,可以尽可能的得到更合理的选择。
把这些东西封装起来,可以定义一个全体代价函数:
之后用梯度下降法,或者更复杂的优化算法来找到一个合适的图像G,并计算J(G)的最小值,这样的话,将能够得到非常好看的结果。
以上就是神经风格迁移的内容。
说明:记录学习笔记,如果错误欢迎指正!转载请联系我。