提示:吴恩达深度学习视频中关于风格损失函数的笔记
风格损失函数
图片的风格到底是什么?
上述图片中的计算过程,选择某一层
l
l
l去为图片的风格定义一个深度测量。
将图片的风格定义为
l
l
l层中各个通道之间激活项的相关系数。
现在将
l
l
l层的激活项取出,这是个
n
H
×
n
W
×
n
C
n_H×n_W×n_C
nH×nW×nC的激活项,它是一个三维的数据块。问题来了,如何知道这些不同通道之间激活项的相关系数呢?现在把这个激活块的不同通道渲染成不同的颜色,并假设有5个通道。
捕捉图片风格需要进行下面操作:
首先,先看前两个通道图中红色和黄色部分,计算两个通道间激活项的相关系数。举个例子,在第一个通道中含有某个激活项,第二个通道中也含有某个激活项,于是它们组成了一对数字,然后看看这个激活项块中其他位置的激活项,它们也分别组成了很多对数字,分别来自第一个红色通道和是第二黄色通道。当我们取得这两个
n
H
×
n
W
n_H×n_W
nH×nW的通道中的所有数字对后,如何计算它们的相关系数呢?又如何决定图片风格呢?
现在看上图,左下角是一个可视化例子,第一个红色通道对应的神经元,能找出图片中的特定位置是否含有垂直的纹理。而第二个黄色通道,对应的这个神经元它可以粗略地找出橙色的区域。什么时候这两个通道拥有高度相关性呢?如果它们有高度的相关性,那么这副图片中出现垂直纹理的地方这块地方很大概率是橙色的。如果说它们不相关,又是什么意思呢?显然,图片中有垂直纹理的地方很大概率不是橙色的。而相关系数描述的就是当图片某处出现这种垂直纹理时,该处又同时是橙色的可能性。
相关系数这个概念提供了一种去测量这些不同特征的方法,比如这些垂直纹理、这些橙色或是其他的特征,去测量它们在图片中的各个位置同时出现或不同时出现的概率。
如果我们在通道之间使用相关系数来描述通道的风格,能做的就是测量我的生成图像中第一个通道是否与第二个通道相关。通过测量,能得知在生成的图像中垂直纹理和橙色同时出现或不同时出现的频率,这样将能够测量生成图像的风格与输入的风格图像的相似程度。
计算图像风格的方法
对于这两个图像,也就是风格图像与生成图像,需要计算一个风格矩阵(gram矩阵)。具体来说,就是用
l
l
l层来测量图像风格。设
α
(
i
,
j
,
k
)
[
l
]
\alpha_{(i,j,k)}^{[l]}
α(i,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个通道)。[在通道中激活项的值代表什么?在特征图中,每个数字都来自于一个特定滤波器在特定位置的卷积,因此每个数字代表一个特征的强度。]
现在要计算关于
l
l
l层的风格矩阵
G
[
l
]
G^{[l]}
G[l](用G表示,因为这种矩阵有时也叫Gram矩阵),这是一个
n
c
[
l
]
×
n
c
[
l
]
n_c^{[l]}×n_c^{[l]}
nc[l]×nc[l]的矩阵,也就是一个方阵,因为有
n
c
n_c
nc个通道,所以矩阵大小是
n
c
[
l
]
×
n
c
[
l
]
n_c^{[l]}×n_c^{[l]}
nc[l]×nc[l],以便计算每一对激活项的相关系数,所以
G
k
k
′
[
l
]
G_{kk'}^{[l]}
Gkk′[l]可以用来测量
k
k
k通道和
k
′
k'
k′通道中的激活项之间的相关系数,
k
k
k和
k
′
k'
k′会在1到
n
c
n_c
nc之间取值(
k
=
1
,
.
.
.
,
n
c
[
l
]
k=1,...,n_c^{[l]}
k=1,...,nc[l]),
n
c
n_c
nc就是
l
l
l层中的通道总数量。
具体地,符号
i
,
j
i,j
i,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_{kk'}^{[l]}
Gkk′[l]的定义,即得到G矩阵(风格矩阵)。
注意:如果两个通道中的激活项数值都很大,那么
G
k
k
′
[
l
]
G_{kk'}^{[l]}
Gkk′[l]也会变得很大,对应地,如果它们不相关,那么
G
k
k
′
[
l
]
G_{kk'}^{[l]}
Gkk′[l]就会很小。对风格图像S和生成图像G都进行这个运算,为了区分在右上角加一个(S)或(G)。
这个公式严格来说,是一种非标准的互相关函数,因为我们没有减去平均数,而是将它们直接相乘。
G
k
k
′
[
l
]
[
S
]
=
∑
i
=
1
n
H
[
l
]
∑
j
=
1
n
W
[
l
]
α
i
,
j
,
k
[
l
]
(
S
)
α
i
,
j
,
k
′
[
l
]
(
S
)
G_{kk'}^{[l][S]} = \sum_{i=1}^{n_H^{[l]}} \sum_{j=1}^{n_W^{[l]}} α_{i,j,k}^{[l](S)} α_{i,j,k'}^{[l](S)}
Gkk′[l][S]=i=1∑nH[l]j=1∑nW[l]αi,j,k[l](S)αi,j,k′[l](S)
这就是风格图像所构成的风格矩阵。
G
k
k
′
[
l
]
[
G
]
=
∑
i
=
1
n
H
[
l
]
∑
j
=
1
n
W
[
l
]
α
i
,
j
,
k
[
l
]
(
G
)
α
i
,
j
,
k
′
[
l
]
(
G
)
G_{kk'}^{[l][G]} = \sum_{i=1}^{n_H^{[l]}} \sum_{j=1}^{n_W^{[l]}} α_{i,j,k}^{[l](G)} α_{i,j,k'}^{[l](G)}
Gkk′[l][G]=i=1∑nH[l]j=1∑nW[l]αi,j,k[l](G)αi,j,k′[l](G)
这就是生成图像所构成的风格矩阵。
现在我们分别从风格图像S和生成图像G得到了两个矩阵,最后这两个矩阵之间的误差:
J
s
t
y
l
e
[
l
]
(
S
,
G
)
=
1
(
2
n
H
[
l
]
n
W
[
l
]
n
C
[
l
]
)
2
∣
∣
G
[
l
]
[
S
]
−
G
[
l
]
[
G
]
∣
∣
F
2
J_{style}^{[l]} (S,G)=\frac{1}{ (2n_H^{[l]} n_W^{[l]} n_C^{[l]})^2 } ||G^{[l][S]} - G^{[l][G]}||_F^2
Jstyle[l](S,G)=(2nH[l]nW[l]nC[l])21∣∣G[l][S]−G[l][G]∣∣F2
=
1
(
2
n
H
[
l
]
n
W
[
l
]
n
C
[
l
]
)
2
∑
k
∑
k
′
(
G
k
k
′
[
l
]
[
S
]
−
G
k
k
′
[
l
]
[
G
]
)
= \frac{1}{ (2n_H^{[l]} n_W^{[l]} n_C^{[l]})^2 } \sum_k \sum_{k'} (G_{kk'}^{[l][S]} - G_{kk'}^{[l][G]})
=(2nH[l]nW[l]nC[l])21k∑k′∑(Gkk′[l][S]−Gkk′[l][G])
这是对
l
l
l层定义的风格损失函数,前面是一个归一化常数。
如果各层都这么定义损失函数,效果会更好,把各个层的结果都加起来,就能定义它们全体了,还需对每个层定义权重,也就是一些额外的超参数,用
λ
[
l
]
\lambda^{[l]}
λ[l]表示。
J
s
t
y
l
e
(
S
,
G
)
=
∑
l
λ
[
l
]
J
s
t
y
l
e
[
l
]
(
S
,
G
)
J_{style}(S,G)=\sum_{l} \lambda^{[l]} J_{style}^{[l]} (S,G)
Jstyle(S,G)=l∑λ[l]Jstyle[l](S,G)
相关博客地址:风格迁移-风格损失函数(Gram矩阵)理解