前言
关于课程《神经网络与深度学习》所做笔记。
本次为第4次作业。
本周课程内容
风格迁移
简介:
如果你是一位摄影爱好者,也许接触过滤镜。它能改变照片的颜色样式,从而使风景照更加锐利或者令人像更加美白。但一个滤镜通常只能改变照片的某个方面。如果要照片达到理想中的样式,经常需要尝试大量不同的组合,其复杂程度不亚于模型调参。
这里我们需要两张输入图像,一张是内容图像,另一张是样式图像,我们将
使用神经网络修改内容图像使其在样式上接近样式图像。
方法:
1.
首先,我们初始化合成图像,例如将其初始化成内容图像。该合成图像是样式迁移过程中唯一需要更新的变量,即样式迁移所需迭代的模型参数。
2.
然后,我们选择一个预训练的卷积神经网络来抽取图像的特征,其中的模型参数在训练中无须更新。深度卷积神经网络凭借多个层逐级抽取图像的特征。我们可以选择其中某些层的输出作为内容特征或样式
特征。
实现流程
以之前放的图像为例,这里选取的预训练的神经网络含有3 个卷积层,其中第二层输出图像的内容特征,而第一层和第三层的输出被作为图像的样式特征。接下来,我们通过正向传播(实线箭头方向)计算样式迁移的损失函数,并通过反向传播(虚线箭头方向)迭代模型参数,即不断更新合成图像。
线性回归可以被视为神经网络的一种特例,即只有一个输入层和输出层,没有隐藏层。
损失函数
定义: 样式迁移常用的损失函数由3 部分组成:
1.
内容损失( content loss )使合成图像与内容图像在内容特征上接近
2.
样式损失( style loss )令合成图像与样式图像在样式特征上接近
3.
总变差损失( total variation loss )则有助于减少合成图像中的噪点。
最后,当模型训练结束时,我们输出样式迁移的模型参数,即得到最终的合成图像。
内容代价函数:
选定隐藏层
l
l
l,用
a
[
l
]
[
C
]
a^{[l][C]}
a[l][C]表示图片
C
C
C 在第
l
l
l层的激活项输出,
a
[
l
]
[
G
]
a^{[l][G]}
a[l][G]表示图片
G
G
G在第
l
l
l层的激活项输出,则定义内容代价函数如下:
J
c
o
n
t
e
n
t
(
C
,
G
)
=
∣
∣
a
[
l
]
[
C
]
−
a
[
l
]
[
G
]
∣
∣
2
2
(1)
J_content(C,G)=||a^{[l][C]}-a^{[l][G]}||_2^2 \tag1
Jcontent(C,G)=∣∣a[l][C]−a[l][G]∣∣22(1)
风格代价函数:
神经网络各隐藏层输出激活项的含义?
如何量化风格差异?
隐藏层1的风格代价函数
J
s
t
y
l
e
[
l
]
=
1
(
2
n
H
[
l
]
n
W
[
l
]
n
C
[
l
]
)
2
∑
k
∑
k
′
(
G
k
k
′
[
l
]
[
S
]
−
G
k
k
′
[
l
]
[
G
]
)
(2)
J_style^{[l]}=\frac{1}{(2n^{[l]}_Hn^{[l]}_Wn^{[l]}_C)^2}\sum_k{\sum_{k'}({G_{kk'}^{[l][S]}-G_{kk'}^{[l][G]}}} )\tag2
Jstyle[l]=(2nH[l]nW[l]nC[l])21k∑k′∑(Gkk′[l][S]−Gkk′[l][G])(2)
总体风格代价函数
J
s
t
y
l
e
(
S
,
G
)
=
∑
l
λ
[
l
]
J
s
t
y
l
e
[
l
]
(
S
,
G
)
(3)
J_{style}(S,G)=\sum_{l}\lambda^{[l]}J^{[l]}_{style}(S,G) \tag3
Jstyle(S,G)=l∑λ[l]Jstyle[l](S,G)(3)
总体代价函数
J
(
G
)
=
α
J
c
o
n
t
e
n
t
(
G
)
+
β
J
s
t
y
l
e
(
G
)
(4)
J(G)=\alpha J_{content}(G)+\beta J_{style}(G) \tag4
J(G)=αJcontent(G)+βJstyle(G)(4)