我写了一个StyleGAN,可以用PyTorch输出最大256x256的大小,并通过FFHQ学习它。
论文介绍
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"摄影作为证据的时代已经过去。"
在这里,我将在阅读正式实施后写出我感兴趣的观点。
在下文中,根据本文,潜在变量将被称为
归一化潜伏
原始实现包括将输入
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输出周围生成模式崩溃时,所以我决定这次不使用此功能,而是通过双线性插值来上下采样。
截断技巧
通过在学习期间和学习后生成期间更改输入,可以减少生成图像的种类,但可以提高质量。
在下面,这是参考文献中提到的论文之一,可以说在生成时使用了截断的正态分布来生成
用于高保真自然图像合成的大规模GAN训练
如附录B中所述,在
StyleGAN中,我们正在修改
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。
以下是互补的
G的移动平均线的权重设置为1e-4,但看起来不错。
(正式使用从迷你批处理中计算出的值)
如果不采用移动平均值,则背景和轮廓会失真,因此此过程对于获得清晰的输出似乎相对重要。
之后,我的印象是,当分辨率增加和降低时,输出很容易受到干扰。这可能与以下事实有关:通过将批大小设置为更大来增加淡入速度。
这就是
的全部。