C GAN

17 Mar 2025 | 6 分钟阅读

条件生成对抗网络(cGAN)是常规 GAN 的一种扩展,它在训练阶段加入了条件信息。传统 GAN 中的生成器生成数据样本时,无法控制生成输出的确切属性。而 cGAN 则能够根据额外信息(如类别标签或其他辅助数据)来生成样本。

为了更好地理解,可以把它们想象成不仅能创作出杰出艺术品,还能接受特定需求的艺术家。在传统的生成对抗网络(GAN)中,艺术家随机创作艺术,不知道要画哪种类型的图片。然而,cGAN 就像是聪明的画家,可以根据特定的需求或事实来生成图像。

C-GAN 的应用

  • 它可以用于将卫星图像转换为地图、将黑白照片转换为彩色照片,或将草图转换为逼真图像等任务。通过根据期望的输出特征对生成器进行条件约束,cGAN 能够实现可控的图像转换。
  • 生成不同年龄段人脸图像是一个常见的应用。通过根据与年龄相关的属性对生成器进行条件约束,cGAN 可以在不同生命阶段生成逼真的人脸图像。
  • cGAN 可以提高图像的分辨率。给定一个低分辨率输入,可以对生成器进行条件约束,以产生高分辨率输出。这在图像放大等任务中非常有用,可以避免显著的质量损失。
  • 在创意应用中,cGAN 可以用来根据用户偏好生成定制内容。例如,生成个性化的时尚单品、室内设计或艺术作品。
  • 在化学领域,cGAN 可以协助生成具有所需性质的分子结构。研究人员可以根据特定的化学属性对生成器进行条件约束,以获得符合特定标准的分子结构。

下面是一个简单 cGAN 架构的概述

C Gan

如你所见,它相当直接。在创建图像时,我们使用噪声 z 与条件 c 的拼接。当我们使用判别器时,我们将生成的图像与我们用来生成它的 c 进行拼接。如果我们展示的是一个真实世界的例子,我们也会包含条件 c。

现在,我们将为 MNIST 创建一个简单的 cGAN,用于图像转换。

导入库

加载数据集




输出

C Gan

这是:2

C GAN

众所周知,GAN 很难训练。由于我们使用了两个神经网络,我们需要确保它们是平衡的。这是问题之一。另一个问题是模式坍塌(mode collapse),即生成器无法产生足够多样的图像。这可能会变得很麻烦,所以我们尝试采用一些技巧来保持 GAN 的平衡。

  • 从正态分布而不是均匀分布中采样
  • 将图像归一化到 -1 和 1 之间,而不是 1 和 0 之间
  • 使用 max(logD) 而不是 min(log(1-D)) 作为训练生成器的损失函数
  • 构建完整的真实图像和生成图像的小批量(mini-batch),而不是混合使用
  • 使用 LeakyReLU 而不是 ReLU
  • 使用 ConvTranspose2D 而不是上采样(Upsampling)
  • 使用标签平滑(Label Smoothing)

此外,我们将添加一组更复杂的变量,在训练期间返回。我们不仅要返回 G 和 D 的损失,还要返回 D 的方差。我们希望判别器损失的波动尽可能小,所以我们会对此进行监控。

生成器网络

该生成器旨在通过生成随机噪声 (z) 和特定信息 (c) 的条件来产生逼真的视觉效果。最后一层的 Tanh 激活函数确保输出图像值在 [-1, 1] 范围内。

判别器网络

该判别器旨在确定输入的图像及附带的条件信息是真实的还是由 cGAN 生成器创建的。最后的 Sigmoid 激活函数会生成一个关于输入真实性的概率分数。

网络初始化

这种初始化方案通常在 GAN 中使用,以帮助稳定训练。生成器和判别器都配备了适当的权重初始化,以增强学习过程并提高 cGAN 的整体性能。

与 Keras 不同,我们必须手动将网络移动到 GPU 上。这不是 Pytorch 自动执行的操作。这是因为它允许你构建一个复杂的多线程数据馈送器……等等。关键是 Pytorch 提供了比 Keras 更大的灵活性。它的速度也快了大约两倍,并且使用的内存要少得多。

在这里,我们将创建一个损失函数和优化器。

继续创建我们的优化器,我们将创建两个优化函数。

训练

现在,我们将看到 cGAN 模型在训练时的工作情况。

模型将在一个循环中进行训练并处理图像。

输出

C Gan
C Gan
C Gan