带PyTorch的StyleGAN


我写了一个StyleGAN,可以用PyTorch输出最大256x256的大小,并通过FFHQ学习它。

68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3132313630332f39633035383261622d633761322d613633322d663130382d3837336361336330396133312e706e67.png

论文介绍

GAN的逐步增长可提高质量,稳定性和变异性

该论文于2017年底发布,是StyleGAN的前身。

由于正式实现是向公众开放的,因此您可以检查您在论文中不了解的细节。
https://github.com/tkarras/progressive_growing_of_gans

在网络结构方面,StyleGAN接管了2种GANS的逐步增长,3种使用最小标准偏差的增加变化和4.1种均衡学习率的章节。

用于生成对抗网络的基于样式的生成器体系结构

并在2018年底发布了StyleGAN专着。 TensorFlow实现也向公众开放。
https://github.com/NVlabs/stylegan

实施阅读理解

已经有一篇关于论文本身概述的文章,所以我将其保留。
StyleGAN"摄影作为证据的时代已经过去。"

在这里,我将在阅读正式实施后写出我感兴趣的观点。
在下文中,根据本文,潜在变量将被称为z,而通过Mapping网络转换的变量将被称为w

归一化潜伏

原始实现包括将输入zpixel_norm相乘的过程。
https://github.com/NVlabs/stylegan/blob/b061cc4effdcd1da86a0cc6e61e64b575cf35ffa/training/networks_stylegan.py#L416-L418
这使" z"成为从N维空间采样的N球体上的一个点。

以下论文描述了相应过程的用法,但是我不确定,因为没有特别提及它的作用。
哪些GAN培训方法实际上可以融合?

双线性上/下采样

2.1节指出使用双线性上/下采样。
这似乎是使用高斯滤波器而不是图像处理中使用的双线性插值进行的处理,请参阅以下论文。

使卷积网络再次移位不变

在参考的论文中,Strided Pooling被三个阶段的Pool Blur Downsample代替,而在StyleGAN的实现中,它是Blur Conv Average Pool,并且首先特别提到了upsample。都可以,而且我觉得有各种各样的飞跃。

实际上,当我尝试在64x64输出周围生成模式崩溃时,所以我决定这次不使用此功能,而是通过双线性插值来上下采样。

截断技巧

通过在学习期间和学习后生成期间更改输入,可以减少生成图像的种类,但可以提高质量。
在下面,这是参考文献中提到的论文之一,可以说在生成时使用了截断的正态分布来生成z
用于高保真自然图像合成的大规模GAN训练

如附录B中所述,在

StyleGAN中,我们正在修改w而不是zw的平均值在学习时保留,而使w接近平均值的值在生成时使用。而且,通过仅将其应用于低分辨率层,其被设计成使得信息在高分辨率层中不会被破坏。

https://github.com/NVlabs/stylegan/blob/b061cc4effdcd1da86a0cc6e61e64b575cf35ffa/training/networks_stylegan.py#L368-L374

G的移动平均线

Gs =发生器的长期平均值,比瞬时快照产生更高质量的结果。

https://github.com/NVlabs/stylegan/blob/b061cc4effdcd1da86a0cc6e61e64b575cf35ffa/pretrained_example.py#L28

一些分布式模型采用了Generator的移动平均值。
我记得大约两年前曾阅读过有关此过程的建议书,但我忘了它是哪一个...

PyTorch实施

存储库

这就是为什么要实现它,但是有了PyTorch,我就能够顺服地实现它,而无需任何特殊的创造力。

网络定义

https://github.com/t-ae/style-gan-pytorch/blob/master/network.py

网络详细定义了模块,因此我认为它很容易阅读。由于使用权重比例定义线性是很麻烦的,因此有一个地方使用Conv1x1代替。

在静态图的TensorFlow中,有必要插入分支函数,因为它会逐渐增长,但我认为最好不要在动态图的PyTorch中进行这样的处理。顺带一提,lod代表什么?)。
https://github.com/NVlabs/stylegan/blob/b061cc4effdcd1da86a0cc6e61e64b575cf35ffa/training/networks_stylegan.py#L535-L544

训练循环

https://github.com/t-ae/style-gan-pytorch/blob/master/train_gan.py#L42-L261

训练循环异常肮脏,因为我将G的移动平均值和损失分支放入了纯文字中。除此之外,我无话可说。

我正在使用tensorboardX进行记录,这非常有用。 PyTorch用户绝对应该使用它。

混合精度学习

介绍了一种使用16位浮点数的快速学习方法。
对于PyTorch,使用NVIDIA apex很容易。
https://github.com/NVIDIA/apex

我之前写过另一篇文章。
PyTorch Apex的混合精度训练

顺便说一下,NaN出来是PGGAN,并为此受到困扰,但是StyleGAN没有这样的事情。

用于学习的Dokcer文件包含在存储库中。

结果

WGAN损失,最小批次大小在较大的设置下进行了实验。
(详细的设置汇总在setting.json中,因此请阅读)。

在一台RTX 2080上完成了学习,大约花了3天的时间才能生成256x256的图像。

将输出的最后阶段原样粘贴到TensorBoard。

face.png

以下是互补的

intpl.png

G的移动平均线的权重设置为1e-4,但看起来不错。
(正式使用从迷你批处理中计算出的值)

如果不采用移动平均值,则背景和轮廓会失真,因此此过程对于获得清晰的输出似乎相对重要。

之后,我的印象是,当分辨率增加和降低时,输出很容易受到干扰。这可能与以下事实有关:通过将批大小设置为更大来增加淡入速度。

这就是

的全部。