一、风格迁移
1. 简介
如果你是一位摄影爱好者,也许接触过滤镜。它能改变照片的颜色样式,从而使风景照更加锐利或者令人像更加美白。但一个滤镜通常只能改变照片的某个方面。如果要照片达到理想中的样式,经常需要尝试大量不同的组合,其复杂程度不亚于模型调参。而风格迁移,可以自动将某图像中的样式应用在另一图像之上。
通常需要两张输入图像,一张是内容图像,另一张是样式图像,然后使用神经网络修改内容图像使其在样式上接近样式图像:
- 方法
首先,初始化合成图像,例如将其初始化成内容图像。该合成图像是样式迁移过程中唯一需要更新的变量,即样式迁移所需迭代的模型参数。然后,选择一个预训练的卷积神经网络来抽取图像的特征,其中的模型参数在训练中无须更新。深度卷积神经网络凭借多个层逐级抽取图像的特征。可以选择其中某些层的输出作为内容特征或样式特征。 - 示例
以之前放的图像为例,这里选取的预训练的神经网络含有3个卷积层,其中第二层输出图像的内容特征,而第一层和第三层的输出被作为图像的样式特征。接下来,通过正向传播(实线箭头方向)计算样式迁移的损失函数,并通过反向传播(虚线箭头方向)迭代模型参数,即不断更新合成图像。
2. 损失函数
内容损失(content loss)使合成图像与内容图像在内容特征上接近;
样式损失(style loss)令合成图像与样式图像在样式特征上接近;
总变差损失(total variation loss)则有助于减少合成图像中的噪点。
最后,当模型训练结束时,我们输出样式迁移的模型参数,即得到最终的合成图像。
内容代价函数
风格代价函数
- 什么是风格?
风格通常是指图像的纹理、色彩、线条等视觉特征的统计属性,它代表了图像的艺术风格或者视觉外观。风格在图像中的表现形式非常多样化,可以是油画风格、水彩画风格、印象派风格等各种形式的艺术风格,也可以是具有特定结构和纹理的视觉外观。
在风格迁移中,我们需要将风格从一个参考图像中提取出来,并将其应用到另一个内容图像上,从而生成一个新的图像,该图像同时保留了内容图像的内容特征和参考图像的风格特征。为了实现这一目标,我们需要定义风格的数学表达方式,通常采用的是基于卷积神经网络的特征表示。
具体来说,我们可以通过在预训练的卷积神经网络中的不同层次提取特征,并计算这些特征之间的统计属性来表示风格。一种常用的方法是计算特征图之间的Gram矩阵,它反映了特征图之间的相关性和纹理信息。
- 怎样量化风格差异?
常用量化风格代价函数的方法是基于Gram矩阵的风格损失(Style Loss)
Gram矩阵反映了特征图之间的相关性和纹理信息,因此可以作为风格的数学表示。具体来说,给定一个特征图张量 F F F,Gram矩阵 G G G 的计算方式为: G = F T ⋅ F G=F^T⋅F G=FT⋅F。通常会使用预训练的卷积神经网络来提取图像的特征表示。我们可以在网络的多个层次提取特征,并计算每个层次的Gram矩阵,然后将生成图像与参考图像在这些Gram矩阵上的差异作为风格代价函数。
二、生成对抗网络GAN
1. 是什么
GAN(Generative adversarial networks)
- GAN是一类神经网络,可以像人类一样生成图像、音乐、语音或文本等素材。
- GANs是近年来一个活跃的研究课题。Facebook的人工智能研究主管Yann LeCun称对抗式训练是机器学习领域“过去10年中最有趣的想法”。
- GAN是一种机器学习系统,可以学习模仿给定的数据分布。深度学习专家Ian Goodfellow等在2014年的NeurIPS论文中首次提出了这一观点。
- GANs由两个神经网络组成,一个用于生成数据,另一个用于区分虚假数据和真实数据。目前典型的应用包括:使用CycleGan进行风格转换、使用Deepfacelab生成人脸
2. 判别模型与生成模型
- 判别模型
在训练过程中,将使用算法调整模型的参数。目标是最小化损失函数,以使模型学习在给定输入时的输出概率分布。在训练阶段之后,使用该模型通过估计输入对应的最可能的数字对手写数字图像进行分类。
- 生成模型
然而,像GANs这样的生成模型经过训练,可以用概率模型来描述数据集是如何生成的。通过从生成模型中采样,您可以生成新数据。判别模型用于监督学习,而生成模型通常用于未标记的数据集,可以看作是一种无监督学习。
为了输出新的样本,生成模型通常考虑一个随机元素影响模型生成的样本。用于驱动生成器的随机样本来自一个隐空间,其中的向量代表了生成样本的一种压缩形式。与判别性模型不同,生成性模型学习输入数据x的概率P(x),通过掌握输入数据的分布,它们能够生成新的数据实例。
3. GAN架构
框架
- 生成器(Generator):
- 生成器负责生成与真实数据相似的合成数据。
- 通常由一个神经网络组成,接受一个随机向量(通常称为噪声向量或潜在向量)作为输入,然后输出一个与真实数据相似的样本。
- 生成器的目标是尽可能地欺骗判别器,使得生成的样本难以被判别器区分出来。
- 判别器(Discriminator):
- 判别器负责对给定的样本进行分类,判断它是来自真实数据还是生成器生成的合成数据。
- 通常由一个二元分类器(如卷积神经网络)组成,接受样本作为输入,并输出一个标量,表示样本来自真实数据的概率。
- 判别器的目标是准确地区分真实数据和合成数据,并尽可能地识别生成器生成的合成数据。
训练
GAN的训练过程是一个博弈过程,通过生成器和判别器之间的对抗学习来提高生成器生成数据的质量。具体而言,训练过程如下:
- 生成器训练:首先,生成器接收一个随机向量作为输入,并生成一个合成样本。然后,将生成的合成样本输入到判别器中,判别器将其分类为真实数据或者合成数据。生成器的目标是使判别器无法区分合成数据和真实数据,因此它的损失函数通常是生成的合成数据被判别为真实数据的概率的负对数似然。
- 判别器训练:判别器接收真实数据和由生成器生成的合成数据作为输入,然后输出每个样本来自真实数据的概率。判别器的目标是准确地区分真实数据和合成数据,因此它的损失函数通常是二元交叉熵损失,用于衡量判别器对真实数据和合成数据的分类准确性。
举例
考虑一个由二维样本
(
x
1
,
x
2
)
(x1,x2)
(x1,x2)组成的数据集的简单例子,在0到2𝜋的区间内,𝑥₂ = sin(𝑥1) ,如下图所示:
这个数据集由位于正弦曲线上的 点
(
x
1
,
x
2
)
({x}_1,{x}_2)
(x1,x2)组成,有一个非常特殊的分布。一个生成类似于数据集样本的对
(
x
~
1
,
x
~
2
)
(\tilde{x}_{1},\tilde{x}_{2})
(x~1,x~2)的GAN的整体结构如下图所示: