4.10 风格代价函数-深度学习第四课《卷积神经网络》-Stanford吴恩达教授


←上一篇↓↑下一篇→
4.9 内容代价函数回到目录4.11 一维到三维推广

风格代价函数 (Style Cost Function)

在上节视频中,我们学习了如何为神经风格迁移定义内容代价函数,这节课我们来了解风格代价函数。那么图片的风格到底是什么意思呢?

在这里插入图片描述

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

在这里插入图片描述

我来详细解释一下,现在你将 l l l 层的激活项取出,这是个 n H ∗ n W ∗ n c n_H*n_W*n_c nHnWnc 的激活项,它是一个三维的数据块。现在问题来了,如何知道这些不同通道之间激活项的相关系数呢?

为了解释这些听起来很含糊不清的词语,现在注意这个激活块,我把它的不同通道渲染成不同的颜色。在这个例子中,假如我们有5个通道为了方便讲解,我将它们染成了五种颜色。一般情况下,我们在神经网络中会有许多通道,但这里只用5个通道,会更方便我们理解。

在这里插入图片描述

为了能捕捉图片的风格,你需要进行下面这些操作,首先,先看前两个通道,前两个通道(编号1、2)分别是图中的红色和黄色部分,那我们该如何计算这两个通道间激活项的相关系数呢?

在这里插入图片描述

举个例子,在视频的左下角在第一个通道中含有某个激活项,第二个通道也含有某个激活项,于是它们组成了一对数字(编号1所示)。然后我们再看看这个激活项块中其他位置的激活项,它们也分别组成了很多对数字(编号2,3所示),分别来自第一个通道,也就是红色通道和第二个通道,也就是黄色通道。现在我们得到了很多个数字对,当我们取得这两个 n H ∗ n W n_H*n_W nHnW 的通道中所有的数字对后,现在该如何计算它们的相关系数呢?它是如何决定图片风格的呢?

在这里插入图片描述

我们来看一个例子,这是之前视频中的一个可视化例子,它来自一篇论文,作者是Matthew ZeileRob Fergus 我之前有提到过。我们知道,这个红色的通道(编号1)对应的是这个神经元,它能找出图片中的特定位置是否含有这些垂直的纹理(编号3),而第二个通道也就是黄色的通道(编号2),对应这个神经元(编号4),它可以粗略地找出橙色的区域。什么时候两个通道拥有高度相关性呢?如果它们有高度相关性,那么这幅图片中出现垂直纹理的地方(编号2),那么这块地方(编号4)很大概率是橙色的。如果说它们是不相关的,又是什么意思呢?显然,这意味着图片中有垂直纹理的地方很大概率不是橙色的。而相关系数描述的就是当图片某处出现这种垂直纹理时,该处又同时是橙色的可能性。

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

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

在这里插入图片描述

现在我们来证实这种说法,对于这两个图像,也就是风格图像与生成图像,你需要计算一个风格矩阵,说得更具体一点就是用 l l l 层来测量风格。

在这里插入图片描述

我们设 a i , j , k [ l ] a^{[l]}_{i,j,k} ai,j,k[l] ,设它为隐藏层 l l l ( i , j , k ) (i,j,k) (i,j,k) 位置的激活项, i , j , k i,j,k ijk 分别代表该位置的高度、宽度以及对应的通道数。现在你要做的就是去计算一个关于 l l l 层和风格图像的矩阵,即 G [ l ] S G^{[l]S} G[l]S l l l 表示层数, S S S 表示风格图像),这( G [ l ] S G^{[l]S} G[l]S )是一个 n c ∗ n c n_c*n_c ncnc 的矩阵,同样地,我们也对生成的图像进行这个操作。

但是现在我们先来定义风格图像,设这个关于 l l l 层和风格图像的, G G G 是一个矩阵,这个矩阵的高度和宽度都是 l l l 层的通道数。在这个矩阵中 k k k k ′ k' k 元素被用来描述通道 k k k k ′ k' k 通道之间的相关系数。具体地:

G k k ′ [ l ] ( S ) = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i , j , k [ l ] ( S ) a i , j , k ′ [ l ] ( S ) G^{[l](S)}_{kk'}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a^{[l](S)}_{i,j,k}a^{[l](S)}_{i,j,k'} Gkk[l](S)=i=1nH[l]j=1nW[l]ai,j,k[l](S)ai,j,k[l](S)

用符号 i , j i,j ij 表示下界,对 i , j , k i,j,k ijk 位置的激活项 a i , j , k [ l ] a^{[l]}_{i,j,k} ai,j,k[l] ,乘以同样位置的激活项,也就是 i , j , k ′ i,j,k' ijk位置的激活项,即 a i , j , k ′ [ l ] a^{[l]}_{i,j,k'} ai,j,k[l] ,将它们两个相乘。然后 i i i j j j 分别加到 l l l 层的高度和宽度,即 n H [ l ] n_H^{[l]} nH[l] n W [ l ] n_W^{[l]} nW[l] ,将这些不同位置的激活项都加起来。 ( i , j , k ) (i,j,k) (i,j,k) ( i , j , k ′ ) (i,j,k') (i,j,k) x x x 坐标和 y y y 坐标分别对应高度和宽度,将 k k k 通道和 k ′ k' k 通道上这些位置的激活项都进行相乘。我一直以来用的这个公式,严格来说,它是一种非标准的互相关函数,因为我们没有减去平均数,而是将它们直接相乘。

在这里插入图片描述

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

G k k ′ [ l ] ( G ) = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i , j , k [ l ] ( G ) a i , j , k ′ [ l ] ( G ) G^{[l](G)}_{kk'}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a^{[l](G)}_{i,j,k}a^{[l](G)}_{i,j,k'} Gkk[l](G)=i=1nH[l]j=1nW[l]ai,j,k[l](G)ai,j,k[l](G)

a i , j , k [ l ] ( S ) a^{[l](S)}_{i,j,k} ai,j,k[l](S) a i , j , k [ l ] ( G ) a^{[l](G)}_{i,j,k} ai,j,k[l](G) 中的上标 ( S ) (S) (S) ( G ) (G) (G) 分别表示在风格图像 S S S 中的激活项和在生成图像 G G G 的激活项。我们之所以用大写字母 G G G 来代表这些风格矩阵,是因为在线性代数中这种矩阵有时也叫Gram矩阵,但在这里我只把它们叫做风格矩阵。

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

对于这个风格矩阵,你要做的就是计算这个矩阵也就是 G [ l ] G^{[l]} G[l] 矩阵,它是个 n c ∗ n c n_c*n_c ncnc 的矩阵,也就是一个方阵。记住,因为这里有 n c n_c nc 个通道,所以矩阵的大小是 n c ∗ n c n_c*n_c ncnc 。以便计算每一对激活项的相关系数,所以 G k k ′ [ l ] G^{[l]}_{kk'} Gkk[l] 可以用来测量 k k k 通道与 k ′ k' k 通道中的激活项之间的相关系数, k k k k ′ k' k 会在1到 n c n_c nc 之间取值, n c n_c nc 就是 l l l 层中通道的总数量。

在这里插入图片描述

当在计算 G [ l ] G^{[l]} G[l] 时,我写下的这个符号(下标 k k ′ kk' kk )只代表一种元素,所以我要在右下角标明是 k k ′ kk' kk 元素,和之前一样, i , j i,j i,j 从一开始往上加,对应 ( i , j , k ) (i,j,k) (i,j,k) 位置的激活项与对应 ( i , j , k ′ ) (i,j,k') (i,j,k) 位置的激活项相乘。记住,这个 i i i j j j 是激活块中对应位置的坐标,也就是该激活项所在的高和宽,所以 i i i 会从1加到 n H [ l ] n_H^{[l]} nH[l] j j j 会从1加到 n W [ l ] n_W^{[l]} nW[l] k k k k ′ k' k 则表示对应的通道,所以 k k k k ′ k' k 值的范围是从1开始到这个神经网络中该层的通道数量 n C [ l ] n_C^{[l]} nC[l] 。这个式子就是把图中各个高度和宽度的激活项都遍历一遍,并将 k k k k ′ k' k 通道中对应位置的激活项都进行相乘,这就是 G k k ′ [ l ] G^{[l]}_{kk'} Gkk[l] 的定义。通过对 k k k k ′ k' k 通道中所有的数值进行计算就得到了 G G G 矩阵,也就是风格矩阵。

G k k ′ [ l ] = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i , j , k [ l ] a i , j , k ′ [ l ] G^{[l]}_{kk'}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a^{[l]}_{i,j,k}a^{[l]}_{i,j,k'} Gkk[l]=i=1nH[l]j=1nW[l]ai,j,k[l]ai,j,k[l]

要注意,如果两个通道中的激活项数值都很大,那么 G k k ′ [ l ] G^{[l]}_{kk'} Gkk[l] 也会变得很大,对应地,如果他们不相关那么 G k k ′ [ l ] G^{[l]}_{kk'} Gkk[l] 就会很小。严格来讲,我一直使用这个公式来表达直觉想法,但它其实是一种非标准的互协方差,因为我们并没有减去均值而只是把这些元素直接相乘,这就是计算图像风格的方法。

在这里插入图片描述

G k k ′ [ l ] ( S ) = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i , j , k [ l ] ( S ) a i , j , k ′ [ l ] ( S ) G^{[l](S)}_{kk'}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a^{[l](S)}_{i,j,k}a^{[l](S)}_{i,j,k'} Gkk[l](S)=i=1nH[l]j=1nW[l]ai,j,k[l](S)ai,j,k[l](S)

你要同时对风格图像 S S S 和生成图像 G G G 都进行这个运算,为了区分它们,我们在它的右上角加一个 ( S ) (S) (S) ,表明它是风格图像 S S S ,这些都是风格图像 S S S 中的激活项,之后你需要对生成图像也做相同的运算。

G k k ′ [ l ] ( G ) = ∑ i = 1 n H [ l ] ∑ j = 1 n W [ l ] a i , j , k [ l ] ( G ) a i , j , k ′ [ l ] ( G ) G^{[l](G)}_{kk'}=\sum_{i=1}^{n_H^{[l]}}\sum_{j=1}^{n_W^{[l]}}a^{[l](G)}_{i,j,k}a^{[l](G)}_{i,j,k'} Gkk[l](G)=i=1nH[l]j=1nW[l]ai,j,k[l](G)ai,j,k[l](G)

和之前一样,再把公式都写一遍,把这些都加起来,为了区分它是生成图像,在这里放一个 ( G ) (G) (G)

在这里插入图片描述

现在,我们有2个矩阵,分别从风格图像 S S S 和生成图像 G G G

在这里插入图片描述

再提醒一下,我们一直使用大写字母 G G G 来表示矩阵,是因为在线性代数中,这种矩阵被称为Gram矩阵,但在本视频中我把它叫做风格矩阵,我们取了Gram矩阵的首字母 G G G 来表示这些风格矩阵。

在这里插入图片描述

最后,如果我们将 S S S G G G 代入到风格代价函数中去计算,这将得到这两个矩阵之间的误差,因为它们是矩阵,所以在这里加一个 F F FFrobenius范数,编号1所示),这实际上是计算两个矩阵对应元素相减的平方的和,我们把这个式子展开,从 k k k k ′ k' k 开始作它们的差,把对应的式子写下来,然后把得到的结果都加起来,作者在这里使用了一个归一化常数,也就是 1 2 n H [ l ] n W [ l ] n c [ l ] \frac{1}{2n_H^{[l]}n_W^{[l]}n_c^{[l]}} 2nH[l]nW[l]nc[l]1 ,再在外面加一个平方,但是一般情况下你不用写这么多,一般我们只要将它乘以一个超参数 β \beta β 就行。

在这里插入图片描述

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

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

J ( G ) = α J c o n t e n t ( C , G ) + β J s t y l e ( S , G ) J(G)=\alpha J_{content}(C,G)+\beta J_{style}(S,G) J(G)=αJcontent(C,G)+βJstyle(S,G)

之后用梯度下降法,或者更复杂的优化算法来找到一个合适的图像 G G G ,并计算 J ( G ) J(G) J(G) 的最小值,这样的话,你将能够得到非常好看的结果,你将能够得到非常漂亮的结果。

这节神经风格迁移的内容就讲到这里,希望你能愉快地在本周的基础训练中进行实践。在本周结束之前,还有最后一节内容想告诉你们,就是如何对1D和3D的数据进行卷积,之前我们处理的都是2D图片,我们下节视频再见。

课程板书

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


←上一篇↓↑下一篇→
4.9 内容代价函数回到目录4.11 一维到三维推广

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zhao-Jichao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值