生成对抗网络(GAN)在生成大型高质量图像方面非常有效。
为了训练更有效的生成器模型,大多数改进都集中在判别器模型上,但对生成器模型的改进却很少。
Style Generative Adversarial Network,简称StyleGAN,是对GAN架构的扩展,它对生成器模型进行了重大改进,包括使用映射网络将潜在空间中的点映射到中间潜在空间,使用中间潜在空间控制生成器模型中每一点的风格,以及在生成器模型中每一点引入噪声作为变化的来源。
该模型不仅能够生成令人印象深刻的、具有真实感的、高质量的人脸照片,而且通过改变风格向量和噪声,还能在不同细节级别上控制生成图像的风格。
在本文中,您将了解Style Generative Adversarial Network,它可以控制生成合成图像的风格。
阅读本文后,你将了解:
- 传统GAN模型生成的合成图像在风格方面缺乏控制。
- StyleGAN模型架构,它在不同细节级别上引入了对生成图像风格的控制。
- StyleGAN架构在生成合成人脸方面取得了令人印象深刻的结果。
启动您的项目,阅读我的新书《Python生成对抗网络》,其中包含分步教程和所有示例的Python源代码文件。
让我们开始吧。

Style Generative Adversarial Network (StyleGAN) 入门指南
照片来源:Ian D. Keating,部分权利保留。
概述
本教程分为四个部分;它们是
- 合成图像缺乏控制
- 通过新的生成器模型控制风格
- 什么是StyleGAN模型架构
- StyleGAN生成图像示例
合成图像缺乏控制
生成对抗网络在生成高质量、高分辨率的合成图像方面非常有效。
生成器模型以潜在空间中的一个点作为输入并生成图像。该模型由第二个模型(称为判别器)进行训练,该判别器学习区分训练数据集中的真实图像和生成器模型生成的假图像。因此,这两个模型在一个对抗性的游戏中竞争,并在训练过程中找到平衡点。
GAN架构的许多改进是通过改进判别器模型实现的。这些变化是基于“更好的判别器模型将反过来生成更逼真的合成图像”的想法。
因此,生成器在一定程度上被忽视了,仍然是一个黑箱。例如,生成合成图像时使用的随机性来源尚不清楚,包括采样点的随机性量和潜在空间的结构。
然而,生成器仍然像黑箱一样运行,尽管最近做出了努力,但对图像合成过程的各个方面的理解……仍然缺乏。潜在空间的性质也了解甚少……
— A Style-Based Generator Architecture for Generative Adversarial Networks, 2018。
对生成器理解的这种局限性可能最体现在对生成图像的控制普遍缺乏。几乎没有工具可以控制生成图像的属性,例如风格。这包括高层特征,如背景和前景,以及精细的细节,如合成对象或主体的特征。
这需要将图像中的特征或属性解耦,并将这些属性的控制添加到生成器模型中。
想从零开始开发GAN吗?
立即参加我为期7天的免费电子邮件速成课程(附示例代码)。
点击注册,同时获得该课程的免费PDF电子书版本。
通过新的生成器模型控制风格
Style Generative Adversarial Network,简称StyleGAN,是对GAN架构的扩展,用于控制生成图像的解耦风格属性。
我们的生成器从学习到的常量输入开始,并根据潜在代码在每个卷积层调整图像的“风格”,从而直接控制不同尺度上图像特征的强度。
— A Style-Based Generator Architecture for Generative Adversarial Networks, 2018。
StyleGAN是渐进式增长GAN的扩展,这是一种训练生成器模型的方法,通过在训练过程中将判别器和生成器模型从小型图像逐步扩展到大型图像,从而能够合成非常大的高质量图像。
除了在训练过程中渐进式增长模型外,StyleGAN还显著改变了生成器的架构。
StyleGAN生成器不再以潜在空间中的一个点作为输入;取而代之的是,有两个新的随机性来源用于生成合成图像:一个独立的映射网络和噪声层。
来自映射网络的输出是一个向量,它定义了风格,并通过一个称为自适应实例归一化(adaptive instance normalization)的新层集成到生成器模型的每个点中。使用这种风格向量可以控制生成图像的风格。
通过在生成器模型中每个点添加噪声来引入随机变化。噪声被添加到整个特征图,使模型能够以精细的、逐像素的方式解释风格。
这种风格向量和噪声的每个块的结合,使得每个块都能将风格的解释和随机变化本地化到给定的细节级别。
新架构实现了高层属性(例如,在人脸上训练时的人脸姿势和身份)和生成图像中的随机变化(例如,雀斑、头发)的自动学习、无监督分离,并且能够直观地、按尺度控制合成。
— A Style-Based Generator Architecture for Generative Adversarial Networks, 2018。
什么是StyleGAN模型架构
StyleGAN被描述为一种渐进式增长GAN架构,具有五处修改,其中每一处都在消融研究中被逐步添加和评估。
生成器逐步的修改列表包括:
- 基线渐进式GAN。
- 添加调整和双线性上采样。
- 添加映射网络和AdaIN(风格)。
- 移除生成器的潜在向量输入。
- 在每个块中添加噪声。
- 添加混合正则化。
下图总结了StyleGAN生成器架构。

StyleGAN模型架构摘要。
取自:《A Style-Based Generator Architecture for Generative Adversarial Networks》。
我们可以更详细地回顾这些修改。
1. 基线渐进式GAN
StyleGAN生成器和判别器模型使用渐进式增长GAN训练方法进行训练。
这意味着两个模型都从小型图像开始,在本例中是4x4图像。模型被拟合直到稳定,然后判别器和生成器都扩展到两倍的宽度和高度(四倍的面积),例如8x8。
每个模型都添加了一个新模块来支持更大的图像尺寸,该模块在训练过程中缓慢淡入。一旦淡入,模型再次训练直到相当稳定,然后重复此过程,使用越来越大的图像尺寸,直到达到所需的图像尺寸,例如1024x1024。
有关渐进式增长GAN的更多信息,请参见论文。
- GAN 的渐进式增长以提高质量、稳定性和变异性, 2017.
2. 双线性采样
渐进式增长GAN使用最近邻层进行上采样,而不是其他生成器模型中常见的转置卷积层。
StyleGAN的第一个偏差点是使用双线性上采样层而不是最近邻。
我们在两个网络中都用双线性采样替换了最近邻上/下采样,我们通过在每个上采样层之后和每个下采样层之前用可分离的二阶二项滤波器对激活进行低通滤波来实现。
— A Style-Based Generator Architecture for Generative Adversarial Networks, 2018。
3. 映射网络和AdaIN
接下来,使用一个独立的映射网络,该网络以潜在空间中随机采样的点作为输入并生成风格向量。
映射网络由八个全连接层组成,例如,它是一个标准的深度神经网络。
为了简化,我们将[潜在空间和中间潜在空间]的维度都设置为512,并且映射f使用8层MLP实现……
— A Style-Based Generator Architecture for Generative Adversarial Networks, 2018。
然后,风格向量通过一种称为自适应实例归一化(AdaIN)的操作进行转换,并集成到生成器模型的每个块的卷积层之后。
AdaIN层首先对特征图的输出进行标准化为标准高斯分布,然后将风格向量作为偏置项添加。
学习到的仿射变换然后将[中间潜在向量]专门化为风格y = (ys, yb),它们控制合成网络g的每个卷积层之后的自适应实例归一化(AdaIN)操作。
— A Style-Based Generator Architecture for Generative Adversarial Networks, 2018。

StyleGAN中自适应实例归一化的计算(AdaIN)。
取自:《A Style-Based Generator Architecture for Generative Adversarial Networks》。
将新的映射网络添加到架构中,还将生成器模型重命名为“合成网络”。
4. 移除潜在点输入
下一个变化是修改生成器模型,使其不再以潜在空间中的一个点作为输入。
取而代之的是,模型具有一个恒定的4x4x512常数值输入,以启动图像合成过程。
5. 添加噪声
合成网络中每个卷积层的输出是一组激活图。
在AdaIN操作之前,将高斯噪声添加到这些激活图中的每一个。为每个块生成不同的噪声样本,并使用每层缩放因子进行解释。
这些是单通道图像,由不相关的Gaussian噪声组成,我们将专用的噪声图像馈送到合成网络的每一层。噪声图像通过学习到的每特征缩放因子广播到所有特征图,然后添加到相应卷积的输出中……
— A Style-Based Generator Architecture for Generative Adversarial Networks, 2018。
该噪声用于在给定细节级别引入风格级别的变化。
6. 混合正则化
混合正则化包括首先从映射网络生成两个风格向量。
选择合成网络中的一个分割点,分割点之前的所有AdaIN操作使用第一个风格向量,分割点之后的所有AdaIN操作使用第二个风格向量。
……我们在训练期间使用混合正则化,其中一定比例的图像是使用两个随机潜在代码而不是一个生成的。
— A Style-Based Generator Architecture for Generative Adversarial Networks, 2018。
这鼓励层和块将风格定位到模型的特定部分以及生成图像中相应的细节级别。
StyleGAN生成图像示例
StyleGAN在生成大型高质量图像和控制生成图像风格方面都非常有效。
在本节中,我们将回顾一些生成的图像示例。
论文作者发布了一个演示模型能力的视频,提供了有用的概述。
高质量人脸
下图取自论文,展示了StyleGAN生成的合成人脸,尺寸分别为4x4、8x8、16x16和32x32。

使用StyleGAN生成高质量人脸的示例。
取自:《A Style-Based Generator Architecture for Generative Adversarial Networks》。
按细节级别改变风格
在合成网络的各个点使用不同的风格向量,可以控制结果图像在不同细节级别的风格。
例如,合成网络中较低分辨率(例如4x4和8x8)的图层块控制高层风格,如姿势和发型。网络模型中(例如16x16和32x32)的图层块控制发型和面部表情。最后,网络输出端较近的图层块(例如64x64到1024x1024)控制颜色方案和非常精细的细节。
下图取自论文,左侧显示生成的图像,顶部显示生成的图像。两行中间图像是用于生成左侧图像的风格向量的示例,而顶部图像的风格向量仅用于较低级别。这使得左侧的图像能够从每列顶部的图像中采用高层风格,如姿势和发型。
复制对应于粗空间分辨率(4^2 – 8^2)的风格,可以将高层方面,如姿势、整体发型、脸型和眼镜,从源B引入,而所有颜色(眼睛、头发、光照)和更精细的面部特征则与A相似。
— A Style-Based Generator Architecture for Generative Adversarial Networks, 2018。

一组生成的人脸(左)采用另一组生成的人脸(顶部)的粗糙风格的示例
取自:《A Style-Based Generator Architecture for Generative Adversarial Networks》。
使用噪声控制细节级别
与前面改变风格的例子类似,作者们改变了模型中不同细节级别(例如,精细、中等、粗糙)的噪声使用。
结果是,噪声可以控制细节的生成,当噪声用于粗糙层块时控制更广泛的结构,当噪声添加到网络输出较近的层时控制精细细节。
我们可以看到,人为地省略噪声会导致“绘画般”的无特征外观。粗糙噪声会导致大范围的头发卷曲和较大背景特征的出现,而精细噪声则会带来更精细的头发卷曲、更精细的背景细节和皮肤毛孔。
— A Style-Based Generator Architecture for Generative Adversarial Networks, 2018。

生成器模型不同级别噪声变化的示例。
取自:《A Style-Based Generator Architecture for Generative Adversarial Networks》。
进一步阅读
如果您想深入了解,本节提供了更多关于该主题的资源。
- A Style-Based Generator Architecture for Generative Adversarial Networks, 2018.
- GAN 的渐进式增长以提高质量、稳定性和变异性, 2017.
- StyleGAN – Official TensorFlow Implementation, GitHub.
- StyleGAN结果视频,YouTube.
总结
在本文中,您了解了Style Generative Adversarial Network,它可以控制生成合成图像的风格。
具体来说,你学到了:
- 传统GAN模型生成的合成图像在风格方面缺乏控制。
- StyleGAN模型GAN模型的架构,它在不同细节级别上引入了对生成图像风格的控制
- StyleGAN架构在生成合成人脸方面取得了令人印象深刻的结果。
你有什么问题吗?
在下面的评论中提出你的问题,我会尽力回答。
Jason您好,我非常喜欢您的作品。您能给我简要概述一下AdaIN的内部架构吗? 谢谢!
感谢您的建议,我将来可能会涵盖它。
如何以编程方式验证图像是真实的还是伪造的?
判别器将做出此预测。
Jason先生,您能否用Keras和TensorFlow做一个关于StyleGAN和风格混合的教程?
感谢您的建议。
Jason您好,我很欣赏您对GAN的介绍。在StyleGAN中,我对潜在空间的解耦感到困惑?这是什么意思?您能否给我们更详细的解释?
感谢您的建议。
想结合StarGAN和DCCRN使用语音信号
感谢您对许多GAN论文进行的高级解释。
一个小问题。您说“映射网络由八个全连接层组成,例如,它是一个标准的深度卷积神经网络。”我认为映射网络是一个标准的馈送前向网络(MLP),没有卷积层,所以我认为这里有一个小错误?
谢谢。是的,看起来像是一个笔误。已修正。
有人知道这个MLP中使用了什么激活函数吗?
它不是MLP,而是一个GAN。
ReLU在GAN中仍然很受欢迎,您可以在这里开始。
https://machinelearning.org.cn/start-here/#gans
映射网络(将潜在空间转换为w)基本上是一个MLP。从StyleGAN代码来看,它们似乎使用了Leaky-ReLU作为激活函数(如果你也在寻找的话)。
谢谢。
您好,感谢您提供的优秀教程。我有一个关于使用A和B源生成图像的问题。例如,我想用我的图像源A来生成B,为此,我该如何输入A源?还是说源A和B都是从训练数据中获取的?
也许这有助于您加载图像。
https://machinelearning.org.cn/how-to-load-and-manipulate-images-for-deep-learning-in-python-with-pil-pillow/
你好
感谢您提供的精彩教程。
我有两个关于向卷积层输出添加噪声的问题。
我理解我们为每个卷积层生成一个高斯噪声。
1-
我们在训练期间使用不同的(新的随机样本)噪声。
还是保持不变,只训练B变量(每通道缩放因子)?
2-
那么在推理时呢(使用随机还是确定性噪声)?
好问题,根据教程。
您能告诉我如何使用StyleGAN架构在stylemixing上测试自定义图像吗?
我没有关于这个主题的教程,也许将来会有。
主题“按细节级别改变风格”重复了,我猜第二个应该是“噪声级别”🙂
谢谢,已修复!
嗨 Jason
感谢您的文章。您有没有可能展示一下如何从零开始实现它?
也许将来会。
嗨,Jason,
非常有趣的揭示Stylegan网络文章。问题是,如果一个人拥有数千架真实飞机的轨迹数据,并且想要生成超逼真(且多样化)的合成飞机轨迹(高度、纬度、经度;多元时间序列),您会选择:
1 – 带有LSTMs/GRUs的Wasserstein GAN与GP。
2 – 尝试修改StyleGAN架构以使用LSTMs/GRUs单元并生成序列?
3 – 其他..
如果您能提供您的意见,那将是极好的。
谢谢,干得好!
谢谢。
对于时间序列,我不建议使用GAN,因为它们是用于图像的,我建议查看特定于时间序列的生成模型的文献。
我正在尝试找到一种使用GAN为3D模型生成纹理的方法。
此外,应该可以通过相同的方式构建3D形状,因为3D形状可以使用矢量置换在2D图像中编码。
这听起来像是一个有趣的项目,让我知道进展如何!
感谢您关于StyleGAN的美丽文章。学到了很多。
不客气。
Jason您好,样本A和B都是从先前生成的虚假图像中提取的,还是其中一个必须来自真实人类?我只是好奇AI是否可能在“凭空”创造一张脸,如果它知道(通过判别器的帮助)真实脸应该是什么样的。
谢谢,
样本 A 和 B 是来自两个不同领域的真实照片。
感谢您的精彩教程。StyleGAN 架构中的“隐变量 Z”是什么?我们如何获得它?它是像普通 GAN 那样从高斯分布中采样,还是通过将图像输入某个预训练网络获得?
不客气。
根据教程,“StyleGAN 生成器不再以潜在空间中的一个点作为输入”。
我建议您重新阅读。
StyleGAN 是否可以被指定生成特定类别的图像,例如“男性,约 25 岁”,而不是随机人脸?
如果可以,应该如何指定这些参数?
也许可以——我认为可以。这很大程度上取决于问题的具体表述和你拥有的训练数据——你可以将图像与特定的输入变量关联起来。直接的 StyleGAN 可能不是最佳选择,最好使用能够提供可训练控制变量的变体。
我对此了解不多,你可能需要深入研究文献来了解最新进展。
Jason,您好,感谢您的教程。论文中,作者提到他们使用了学习到的常数,而不是随机的隐变量。这个学习到的常数,是随机初始化的向量,然后在训练期间通过反向传播进行更新(像卷积层的权重一样),然后在推理时被视为一个常数吗?
我不确定,我假设它是一个学习/适应的向量输入。
在 AdaIN 块之前的学习仿射变换(Learned affine transformations)是否只是全连接层,其权重在训练期间被学习,还是其他什么?
据我记忆,我认为是这样——你可以查阅论文和相关的代码项目来确认。
嗨,Jason,
我想知道 StyleGAN 是否可以用于特征提取,以便在增量学习场景中用于特征回放?总的来说,在 GAN 的变体中,StyleGAN 是否是特征提取的最佳选择?
或许可以试试看?
StyleGAN 的合成网络中 3x3 的卷积是如何工作的,或者它使用了什么算法?
本教程解释了卷积层的工作原理。
https://machinelearning.org.cn/convolutional-layers-for-deep-learning-neural-networks/
嗨,Jason,
我正在尝试构建一个 GAN,将一件艺术品风格转移到图片中的时尚单品,例如 T 恤。您推荐哪种 GAN?
先生,您能否简要解释一下如何制作自定义数据集以便我们进行训练?请帮助我的项目工作。
你好 deepa……以下资源可能对您有帮助
https://machinelearning.org.cn/a-guide-to-getting-datasets-for-machine-learning-in-python/