技术 | 生成对抗网络(GANs)的前沿话题(二)

推荐理由:

1.本文对GANs的原理进行了简明扼要的阐述,并结合其众多主流的前沿应用。

2.对于GANs训练中的常见问题进行了细致归类总结,并给出了针对性的改进方法。

3.结合实例,提供了详细的代码实例。有利于读者加深巩固对GANs的认知。

4.需要本教程源代码,请添加微信janelj78,回复:gan 获取。
 

GANs的其他类型

 

现在还有许多其他类型的GAN已经出现用于解决特定于域的问题以及不同类型的数据(例如,时间序列,图像或普通的csv样式数据)。

我将在本节讨论的GAN类型是:

Wasserstein GAN

CycleGAN

条件GAN(前面简要讨论过)

Wasserstein GAN


 

在我看来这是最重要的GAN类型,所以要注意!


 

使用标准的GAN配方,我们已经观察到训练非常不稳定。 鉴别器通常改进太快以至于生成器能赶上,这就是为什么我们需要调节学习速率或在两个网络之一上执行多个epochs。 为了获得合适的输出,我们需要仔细平衡,即使这样,模型崩溃也是非常频繁的。


 

一般而言,生成模型试图最小化实际和以获取分布之间的差距(差距就是一切!)。 Wasserstein(也称为EM,Earth-Mover)距离,非正式定义指的是当分布被解释为在区域D上堆积一定dirt量的两种不同方式。Wasserstein距离是转换已积累数据进入另一个堆的最小成本,我们在这里假设成本是移动的dirt量乘以它移动的距离。


 

不幸的是,在这种情况下,精确的计算是难以处理的。但是,我们可以使用CNN来估算Wasserstein距离。在这里,我们重用了鉴别器,其输出现在是无界的。我们定义了与Wasserstein损失相对应的自定义损失函数:


 


 

这里有什么想法? 我们可以尽可能地对一种类型进行预测,对尽可能小的其他类型进行预测。


 

Wasserstein论文的作者声称:

- 在训练期间更高的稳定性,更少需要仔细平衡发电机和鉴别器。

- 有意义的损失度量与样本质量很好地产生相关。

- 模型崩溃很少见。


 

在Keras框架中实施Wasserstein GAN的提示:

- 使鉴别器输出不受限制,即应用线性激活。

- 使用小权重进行初始化,以便从一开始就不会遇到剪切问题。

- 请记住运行足够的鉴别器更新。 这在WGAN设置中至关重要。

- 您可以使用Wasserstein代理损失实施。

- 通过实现您自己的Keras约束来剪辑鉴别器权重。


 


 

这是一个复杂的主题,实践Wasserstein GAN并不是一项简单的任务。 如果你有兴趣为个人项目寻求其中一项,我建议你阅读我之前引用的原始论文。


 

CycleGAN


 

还记得我们看到一匹马与斑马交换的第一张图片吗?这就是一个CycleGAN。CycleGAN将样式传输到图像。这与进行神经风格转移基本相同,我将在以后的文章中介绍。


 

举一个例子,想象一下著名的如金门大桥的照片,然后从另一幅图像中提取风格,这可能是一幅着名的画作,并以所述著名画作的风格重新绘制桥梁的图片。


 

作为我的神经传递学习文章的预告片,这里是我之前做过的一个例子:


 


 

将GAN应用于这些类型的问题相对简单,它本质上是一个图像重建。 我们使用第一个网络G将图像x转换为y。 我们用另一个深度网络F来反转该过程以重建图像。 然后,我们使用均方误差MSE来指导G和F的训练。

 

这里的不同之处在于我们实际上并不关心重建图像,我们试图混合两个图像的样式。 在GAN实现中,将鉴别器D添加到现有设计中以指导发电机网络更好地执行。 D充当训练样本和生成的图像之间的批评者。 通过这种批评,我们使用反向传播来修改生成器以产生图像,以解决由鉴别器识别的缺点。 在这个问题中,我们引入了一个鉴别器D,以确保Y类似于梵高的绘画。

 


 

CycleGAN将图片从一个域传输到另一个域。 在真实图像和梵高绘画之间转换图片。 我们建立了三个网络。

- 生成器G将真实图像转换为梵高风格图片。

- 生成器F将梵高风格的图片转换为真实图像。

- 鉴别器D用于识别真实或生成的梵高图片。

- 对于反方向,我们只是反转数据流并构建一个额外的鉴别器来识别真实图像。
 

创建斑马/马图像的此实现的示例如下所示。


 


 

Conditional GAN


 

与在VAEs中一样,GAN可以简单地用于生成特定的数据模式。 有条件的GAN的参考文献可以在这里找到。如果生成器和鉴别器都基于某些额外信息c,我们可以将GAN的生成模型扩展到条件模型。 该c可以是任何类型的辅助信息,例如类标签或来自其他模态的数据。 我们可以通过将c作为附加输入层馈入鉴别器和发生器来执行调节。


 

在生成器中,先前输入噪声p(z)和c在联合隐藏表示中组合,并且在对抗训练框架中允许在如何组成该隐藏时表现出具有相当大的灵活性。 在鉴别器中,x和c表示为输入和判别函数。

 

GAN故障排除

 

对于那些喜欢摘要的人,请简要概述我们到目前为止讨论过的所有故障排除方法。


 

1、模型。确保正确定义模型。 您可以通过培训vanilla图像分类任务来单独调试鉴别器。

2、数据。将输入正确归一化为-1,1。 在这种情况下,确保使用tanh作为生成器的最终激活。

3、噪声。尝试从正态分布(不均匀)中采样噪声向量。

4、正态化。尽可能应用BatchNorm,并在单独的小批量中发送真实和假冒样本。

5、激活函数。使用LeakyRelu而不是Relu。

6、平滑。应用标签平滑以避免在更新鉴别器时过度自信,即将实际图像的目标设置为小于1。

7、诊断。不断监测梯度的大小。

8、梯度消失。如果鉴别器变得太强(鉴别器损失函数值为0),尝试降低其学习速率或更频繁地更新发生器。