【67】风格代价函数

1. 风格相关系数

比如有这样一张图片,可能已经对这个计算很熟悉了,它能算出这里是否含有不同隐藏层
现在选择了某一层 l ll(编号1),比如这一层去为图片的风格定义一个深度测量
现在要做的就是将图片的风格定义为 l ll 层中各个通道之间激活项的相关系数

现在将 l ll 层的激活项取出,这是个nH × nW × nC的激活项,它是一个三维的数据块

关于不同通道之间激活项的相关系数
现在注意这个激活块,把它的不同通道渲染成不同的颜色

在这个例子中,假如有5个通道,将它们染成了五种颜色
一般情况下,在神经网络中会有许多通道
但这里只用5个通道,会更方便理解

为了能捕捉图片的风格,需要进行下面这些操作
首先先看前两个通道,前两个通道(编号1、2)分别是图中的红色和黄色部分

假设在图片左下角在第一个通道中含有某个激活项(蓝色点),第二个通道也含有某个激活项(蓝色点)
于是组成了一对数字(编号1)

然后再看看这个激活项块中其他位置的激活项,它们也分别组成了很多对数字(编号2,3所示)
分别来自第一个通道(红色通道)和第二个通道(黄色通道)
现在得到了很多个数字对,当取得这两个nH × nW的通道中所有的数字对后

红色的通道(编号1)对应的是这个神经元(编号3),它能找出图片中的特定位置是否含有这些垂直纹理
黄色的通道(编号2)对应的是这个神经元(编号4),它可以粗略地找出橙色的区域

如果两个通有高度相关性
那么图片中出现垂直纹理的地方,那么这块地方很大概率是橙色
如果说它们是不相关的
这意味着图片中有垂直纹理的地方很大概率不是橙色的

而相关系数描述的就是当图片某处出现这种垂直纹理时,该处又同时是橙色的可能性

相关系数这个概念提供了一种去测量这些不同的特征的方法
比如这些垂直纹理和橙色或是其他的特征去测量它们在图片中的各个位置同时出现或不同时出现的频率

如果在通道之间使用相关系数来描述通道的风格,能做的就是:
测量生成图像中第一个通道(编号1)是否与第二个通道(编号2)相关
通过测量,能得知在生成的图像中垂直纹理和橙色同时出现或者不同时出现的频率
这样将能够测量生成的图像的风格与输入的风格图像的相似程度

2. 风格矩阵
对于这两个图像,也就是风格图像与生成图像,需要计算一个风格矩阵
说得更具体一点就是:用 l ll 层来测量风格

设ai,j,k[l] 为隐藏层l中( i, j, k)位置的激活项
i,j,k分别代表该位置的高度、宽度以及对应的通道数

现在要做的就是去计算一个关于 l ll 层和风格图像的矩阵,即G[l](S)(l表示层数,S表示风格图像)
这G[l](S)是一个nc × nc的矩阵,同样地,也对生成的图像进行这个操作G[l](G)

但是现在先来定义风格图像,设这个关于 l ll 层和风格图像的
G 这个矩阵的高度和宽度都是 l ll 层的通道数
在这个矩阵中 k 和 k’ 元素被用来描述 k 通道和 k’ 通道之间的相关系数

用符号i,j表示下界,对i,j,k位置的激活项ai,j,k[l],乘以同样位置的激活项
也就是 i, j, k’ 位置的激活项,即ai,j,k[l],将它们两个相乘
然后i和j分别加到l层的高度和宽度,即 nH[l] 和 nW[l],将这些不同位置的激活项都加起来
( i, j, k) 和 ( i, j, k’) 中x坐标和y坐标分别对应高度和宽度
将 k 通道和 k’ 通道上这些位置的激活项都进行相乘

一直以来用的这个公式,严格来说,它是一种非标准的互相关函数
因为没有减去平均数,而是将它们直接相乘

这就是输入的风格图像所构成的风格矩阵,然后,再对生成图像做同样的操作

上标(S)和(G)分别表示在风格图像S中的激活项和在生成图像G的激活项

之所以用大写字母G来代表这些风格矩阵,是因为在线性代数中这种矩阵有时也叫Gram矩阵
但在这里只把它们叫做风格矩阵

所以要做的就是计算出这张图像的风格矩阵,以便能够测量出刚才所说的这些相关系数
更正规地来表示,用ai,j,k[l]来记录相应位置的激活项,也就是l层中的 i, j, k位置
所以 i 代表高度,j 代表宽度,k 代表着l中的不同通道
之前说过,有5个通道,所以 k 就代表这五个不同的通道

对于这个风格矩阵,要做的就是计算这个矩阵也就是G[l] 矩阵,它是个nc×nc的矩阵,也就是一个方阵
记住,因为这里有nc个通道,所以矩阵的大小是nc×nc
以便计算每一对激活项的相关系数
所以G(kk’)[l] 可以用来测量 k 通道与 k’ 通道中的激活项之间的相关系数
k 和 k '会在1到nc之间取值,nc就是 l ll 层中通道的总数量

要注意,如果两个通道中的激活项数值都很大,那么G(kk’)[l]也会变得很大
对应地,如果他们不相关那么G(kk’)[l]就会很小

严格来讲,一直使用这个公式来表达直觉想法
但它其实是一种非标准的互协方差,因为并没有减去均值而只是把这些元素直接相乘
这就是计算图像风格的方法

3. 风格代价函数
现在,有2个风格矩阵,分别从风格图像S和生成图像G

最后,如果将S和G代入到风格代价函数中去计算,这将得到这两个矩阵之间的误差

因为它们是矩阵,所以在这里加一个F(Frobenius范数,编号1所示)
这实际上是计算两个矩阵对应元素相减的平方的和
把这个式子展开,从 k 和 k’ 开始作它们的差,把对应的式子写下来,然后把得到的结果都加起来
在这里使用了一个归一化常数,也就是

再在外面加一个平方
但是一般情况下不用写这么多,一般只要将它乘以一个超参数β就行

最后,这是对l层定义的风格代价函数,和之前见到的一样
这是两个矩阵间一个基本的Frobenius范数
也就是S图像和G图像之间的范数再乘上一个归一化常数,不过这不是很重要

实际上,如果对各层都使用风格代价函数,会让结果变得更好
如果要对各层都使用风格代价函数,可以这么定义代价函数
把各个层的结果(各层的风格代价函数)都加起来,这样就能定义它们全体了
还需要对每个层定义权重,也就是一些额外的超参数,用 λ[l] 来表示
这样将能够在神经网络中使用不同的层
包括之前的一些可以测量类似边缘这样的低级特征的层,以及之后的一些能测量高级特征的层
使得神经网络在计算风格时能够同时考虑到这些低级和高级特征的相关系数
这样,在基础的训练中在定义超参数时,可以尽可能的得到更合理的选择

为了把这些东西封装起来,你现在可以定义一个全体代价函数

之后用梯度下降法,或者更复杂的优化算法来找到一个合适的图像G,并计算J(G) 的最小值
即维持网络不同层的风格图像S同样位置的激活项的乘积之和与生成图像G尽量相同
这样的话,将能够得到非常好看的结果

原文地址:https://www.cnblogs.com/lau1997/p/12391244.html