图片风格转移论文_CNN-Gram matrix理解
为了理解Gram matrix在深度学习的应用,我们首先要理解什么是Gram matrix,这里设计的知识点比较简单。
内积
首先是向量的内积定义:
向量的点乘,对两个向量执行内积运算,就是对这两个向量对应位一一相乘之后求和的操作,内积的结果是一个标量。举例子
A = [a1,a2 , , , an],
B = [b1, b2, , , , bn]
so, A·B = [a1✖️ b1, a2✖️ b2, , , an✖️ bn] 直接对应相乘
内积的作用是可以判断向量A和向量B的夹角和方向的关系。如果数值为正值,则代表方向一样,0代表互相垂直,负值代表方向相反。
Gram matrix矩阵的解释
n维欧式空间中任意k个向量之间两两的内积所组成的矩阵,称为这k个向量的格拉姆矩阵(Gram matrix)
这是个对称矩阵。
而我们在深度学习中是想要对每一层的所有特征向量做Gram matrix。具体的表现是:
比如这一层有三个特征向量features,图片经过这三个features之后输出称为feature maps。则这三个features map组成的Gram matrix是如下所示
即Gram matrix是计算每个channel i 的feature map和每个channel j 的feature map的内积,即计算每两个feature maps的相关程度。 因此公式是
G
i
j
l
=
∑
k
F
i
k
l
F
j
k
l
G_{ij}^l = \sum_k F_{ik}^l F_{jk}^l
Gijl=k∑FiklFjkl
其中l表示 layers层,i 表示 channel i 的feature map;j 表示 channel j 的feature map。k表示 1-k 个内积相乘d
在风格迁移中,应用了gram matrix。如果两个图像的features map的Gram矩阵的差异较小,就可以认定这两个图像风格是相近的。有了表示风格的Gram Matrix,要度量两个图像风格的差异,只需比较他们Gram Matrix的差异即可。用下面的公式即可:
E
t
=
1
4
N
t
2
M
t
2
∑
i
,
j
(
G
i
,
j
l
−
A
i
,
j
l
)
2
E_t = \frac{1}{4N_t^2 M_t^2}\sum_{i,j}(G_{i,j}^l- A_{i,j}^l)^2
Et=4Nt2Mt21i,j∑(Gi,jl−Ai,jl)2
论文剖析
那么回到论文里的style提取中,具体如何应用Gram 矩阵呢?
首先,我们要理解input有三张图, 分别是内容图-content img,风格图-style img和白噪音图-white noise。白噪音图是作为一个初始的生成图,主要是为了优化器的进行。
【补充一点,内容提取主要是通过VGG神经卷积网络训练得到的图便作为内容提取,这是因为越深层,能够有效的提取图片全局的特征和内容,这是因为在深层layers出来的图片每个像素对应的receptive field数值很大】
因此,为了进行风格转移,我们需要把这三张图 去训练VGG的网络,具体怎么训练如下:
所以对比初始图片-白噪音图片和风格图片,我们可以通过比较他们两 每层的gram matrix去计算他们图片style的相关性。我们可以得到他们style的损失函数
L
o
s
s
s
t
y
l
e
=
E
l
=
w
∑
l
(
G
l
−
A
l
)
2
Loss_{style}=E_l =w\sum_{l}(G^l- A^l)^2
Lossstyle=El=wl∑(Gl−Al)2
通过minimize损失函数,即通过反向传播来更新白噪音图片,达到两张图片 style的最大相似。
同时,那么怎么比较内容图片和白噪音图片的损失呢?
首先我们知道 内容图片是通过五层卷积网络得到的,每一层我们都可以得到一个内容图片,记为
P
L
P^L
PL, L是layers的层数。那么白噪音图片也是通过同样的五层卷积网络得到的,每一层都有一个output,记为,
F
L
F^L
FL, 所以为了让他们内容的最大相似,我们可以计算他们的损失函数为
L
o
s
s
c
o
n
t
e
n
t
=
∑
(
F
L
−
P
L
)
2
Loss_{content} = \sum (F^L-P^L)^2
Losscontent=∑(FL−PL)2
或者,直接使用最后一层的feature map计算损失函数,记为
L
o
s
s
c
o
n
t
e
n
t
=
∑
i
,
j
(
F
i
,
j
5
−
P
i
,
j
5
)
2
Loss_{content} = \sum_{i,j} (F_{i,j}^5-P_{i,j}^5)^2
Losscontent=i,j∑(Fi,j5−Pi,j5)2
具体流程如下:
总结,把这两个损失函数按线性函数来相加,得到总loss
L
t
o
t
a
l
=
α
L
c
o
n
t
e
n
t
+
β
L
s
t
y
l
e
L_{total} = \alpha L_{content} + \beta L_{style}
Ltotal=αLcontent+βLstyle
再用这个总loss反向传播,更新白噪音图片,使得这个白噪音图片最大化的融合风格图片的风格和内容图片的内容.
下面是论文关于这部分的总框架图: