MSG-GAN Multi-Scale Gradients for Generative Adversarial Networks

MSG-GAN: Multi-Scale Gradients for Generative Adversarial Networks

虽然生成对抗网络(GANs)在图像合成任务中取得了巨大的成功,但它们却很难适应不同的数据集,部分原因是训练期间的不稳定性和对超参数的敏感性。这种不稳定性的一个普遍接受的原因是,当真实分布和虚假分布的支持度没有足够的重叠时,从鉴别器传递到生成器的梯度变得毫无信息。在这项工作中,我们提出了多尺度梯度生成对抗网络(MSG-GAN),这是一种简单而有效的技术,通过允许梯度从鉴别器流向生成器的多个尺度来解决这个问题。

这种技术为高分辨率图像合成提供了一种稳定的方法,并可作为常用的渐进式增长技术的替代方案。我们表明,MSG-GAN在各种不同大小、分辨率和领域的图像数据集以及不同类型的损失函数和架构上都能稳定地收敛,所有这些都有相同的固定超参数。与最先进的GANs相比,我们的方法在大多数情况下都能匹配或超过其性能。

1. Introduction

我们提出一种方法来解决图像生成任务的训练不稳定问题,研究如何利用多尺度的梯度来生成高分辨率的图像(由于数据维度的原因,通常更具挑战性),而不依赖以前的贪婪方法,如渐进式增长技术[15, 16]。MSG-GAN允许判别器不仅查看生成器的最终输出(最高分辨率),而且还查看中间层的输出(图2)。因此,判别器成为生成器多个尺度输出的函数,重要的是,它同时将梯度传递给所有尺度(更多细节见第1.1节和第2节)。

此外,我们的方法对不同的损失函数(我们展示了WGAN-GP和非饱和GAN损失与单边梯度惩罚的结果)、数据集(我们展示了广泛的常用数据集和新创建的印度名人数据集的结果)和架构(我们将MSG方法与ProGANs和StyleGAN基础架构整合)都很稳健。与渐进式增长[15]一样,我们注意到多尺度梯度在FID得分方面比普通的DCGAN架构有相当大的改善。

然而,我们的方法在大多数现有的数据集上以与最先进的方法相当的训练时间实现了更好的性能,而不需要渐进式增长引入的额外超参数,如不同生成阶段(决议)的训练计划和学习率。这种稳健性使得MSG-GAN方法可以很容易地在新的数据集上 “开箱即用”。我们还通过在高分辨率的FFHQ数据集上进行消融实验,展示了多尺度连接在多个生成阶段(粗、中、细)上的重要性。

综上所述,我们提出了以下贡献。首先,我们引入了一种用于图像合成的多尺度梯度技术,改善了先前工作中定义的训练的稳定性。其次,我们表明,我们可以在一些常用的数据集上稳健地生成高质量的样本,包括CIFAR10、Oxford102花、CelebA-HQ、LSUN教堂、Flickr Faces HQ和我们新的印度名人,都有相同的固定超参数。这使得我们的方法易于在实践中使用。

1.1. Motivation

Arjovsky和Bottou[1]指出,GANs训练不稳定的原因之一是,当真实分布和虚假分布的support之间没有大量重叠时,随机(无信息)梯度从判别器传递到生成器。一个早期的例子提出在真实和虚假图像中添加实例噪声,使supports 最小化[1, 30]。最近,Peng等人[25]提出了输入图像和鉴别器对这些输入图像的最深表示之间的mutual information bottleneck,称为variational discriminator bottleneck(VDB[25]),Karras等人[15]提出了一种渐进式增长技术,增加不断增加的分辨率层。

VDB解决方案迫使鉴别器只关注图像中最有辨识度的特征进行分类,这可以被看作是实例噪声的一个适应性变体。我们的工作与VDB技术是正交的,我们把对MSG-GAN和VDB组合的研究留给未来的工作

渐进式增长技术通过逐层训练GAN来解决不稳定的问题,逐渐将生成图像的操作分辨率提高一倍。直观地说,这种技术有助于解决support overlap重叠问题,因为它首先在数据维度较低的低分辨率上实现了良好的分布匹配,然后用这些先前训练的权重部分初始化(真实分布和假分布之间有大量的support overlap重叠)高分辨率训练,重点学习更精细的细节。

虽然这种方法能够产生最先进的结果,但它可能很难训练,因为每个分辨率增加了需要调整的超参数,包括不同的迭代次数、学习率(对于生成器和鉴别器[12]来说可能不同)和 fade-in iterations。此外,一个同时提交的文件[17]发现,它导致了相位伪影,即某些生成的特征附着在特定的空间位置。因此,我们的主要动机在于通过提供一个更简单的替代方案来解决这些问题,从而获得高质量的结果和稳定的训练。

尽管目前在Imagenet数据集上最先进的类条件图像生成方法,即BigGAN[4],并没有采用多尺度图像生成,但请注意他们操作的最高分辨率是512x512。所有高分辨率的先进方法[15, 16, 17, 34, 40]都使用了某种形式的多尺度图像合成。多尺度图像生成是一种成熟的技术,在深度网络开始流行这项任务之前,就已经有了一些方法[20, 35]。最近,一些基于GAN的方法将高分辨率图像合成的过程分解为更小的子任务[36, 39, 38, 8, 9, 15, 34, 40]。

例如,LRGAN[36]使用单独的生成器来合成最终图像的背景、前景和compositor masks。GMAN和StackGAN等作品分别采用一个生成器和多个判别器来进行教学和多尺度生成的变化[8, 39, 38].MAD-GAN[9]则采用多个生成器来解决模式崩溃的问题,通过训练多代理设置,使不同的生成器在训练数据集中捕捉不同的模式。

LapGAN[5]使用一个生成器和多个判别器对不同尺度的图像的拉普拉斯金字塔的多尺度成分进行建模。Pix2PixHD[34]使用三个结构相似的判别器,作用于通过对真实图像和生成的图像进行下采样得到的三种不同分辨率的图像。LapGAN[5]使用一个生成器和多个判别器对不同尺度的图像的拉普拉斯金字塔的多尺度成分进行建模。Pix2PixHD[34]使用三个结构相似的判别器,作用于通过对真实图像和生成的图像进行下采样得到的三种不同分辨率的图像。

我们提出的方法从所有这些作品中获得了建筑学上的灵感,并建立在他们的教义和意识形态之上,但有一些关键的区别。在MSG-GAN中,我们使用一个单一的判别器和一个具有多尺度连接的生成器,这使得梯度可以同时在多个分辨率下流动。所提议的方法有几个优点(主要由简单性驱动)。如果在每个分辨率下使用多个判别器[39, 38, 5, 40, 34],总参数在不同尺度下呈指数增长,因为需要重复下采样层,而在MSG-GAN中,这种关系是线性的。

在MSG-GAN中,我们使用一个单一的判别器和一个具有多尺度连接的生成器,这使得梯度可以同时在多个分辨率下流动。所提议的方法有几个优点(主要由简单性驱动)。如果在每个分辨率下使用多个判别器[39, 38, 5, 40, 34],总参数在不同尺度下呈指数增长,因为需要重复下采样层,而在MSG-GAN中,这种关系是线性的。此外,具有不同有效场的多个判别器[34, 40]不能跨尺度共享信息,这可以使任务更加容易。除了所需的参数和设计选择较少外,我们的方法还避免了在多个尺度上生成的图像之间需要明确的颜色一致性正则化项,这在StackGAN[38]中是必要的。

2. Multi-Scale Gradient GAN

在这里插入图片描述

图2:MSG-GAN的架构,这里显示的是ProGANs[15]中提出的基础模型。我们的结构包括从生成器的中间层到判别器的中间层的连接。送到鉴别器的多尺度图像与从卷积层的主要路径上得到的相应激活量相连接,然后是一个组合函数(黄色显示)。

我们对MSG-GAN框架应用于两个基础架构进行了实验,即ProGANs[15]和StyleGAN[16]。我们将这两种方法分别称为MSG-ProGAN和MSG-StyleGAN。尽管名称不同,但在任何MSG变体中都没有使用渐进式增长,我们注意到没有渐进式增长的ProGANs本质上是DCGAN[26]架构。图2显示了我们的MSG-ProGAN架构的概况,我们在本节中对其进行了更详细的定义,并在补充材料中包括了MSGStyleGAN模型的细节。

让生成器函数 g g e n g_{gen} ggen的初始块定义为 g g e n : Z → A b e g i n g_{gen} : Z →A_{begin}

image-to-Image Translation with Conditional Adversarial Networks(条件对抗网络的图像到图像转换)是一种用于图像转换的深度学习方法。它通过训练一个生成器网络和一个判别器网络来实现图像的转换。生成器网络将输入图像转换为目标图像,而判别器网络则试图区分生成的图像和真实的目标图像。 这种方法的关键是使用对抗性训练。生成器网络和判别器网络相互竞争,以提高生成器网络生成逼真图像的能力。生成器网络通过最小化判别器网络对生成的图像的判别误差来学习生成逼真的图像。判别器网络则通过最大化对生成的图像和真实图像的判别能力来学习区分真实图像和生成图像。 在条件对抗网络中,生成器网络和判别器网络都接收额外的条件输入,以指导图像转换的过程。这个条件输入可以是任何与图像转换任务相关的信息,例如标签、语义分割图或其他图像。 通过训练生成器网络和判别器网络,条件对抗网络可以实现各种图像转换任务,例如将黑白图像转换为彩色图像、将马的图像转换为斑马的图像等。 这是一个使用条件对抗网络进行图像到图像转换的示例代码: ```python import tensorflow as tf from tensorflow.keras import layers # 定义生成器网络 def build_generator(): # 定义生成器网络结构 generator = tf.keras.Sequential() generator.add(layers.Conv2DTranspose(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(32, (4, 4), strides=(2, 2), padding='same')) generator.add(layers.BatchNormalization()) generator.add(layers.ReLU()) generator.add(layers.Conv2DTranspose(3, (4, 4), strides=(2, 2), padding='same', activation='tanh')) return generator # 定义判别器网络 def build_discriminator(): # 定义判别器网络结构 discriminator = tf.keras.Sequential() discriminator.add(layers.Conv2D(64, (4, 4), strides=(2, 2), padding='same', input_shape=(256, 256, 3))) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(128, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(256, (4, 4), strides=(2, 2), padding='same')) discriminator.add(layers.BatchNormalization()) discriminator.add(layers.LeakyReLU()) discriminator.add(layers.Conv2D(1, (4, 4), strides=(1, 1), padding='same')) return discriminator # 定义条件对抗网络 class cGAN(tf.keras.Model): def __init__(self, generator, discriminator): super(cGAN, self).__init__() self.generator = generator self.discriminator = discriminator def compile(self, g_optimizer, d_optimizer, loss_fn): super(cGAN, self).compile() self.g_optimizer = g_optimizer self.d_optimizer = d_optimizer self.loss_fn = loss_fn def train_step(self, real_images, labels): # 生成器网络生成假图像 with tf.GradientTape() as tape: fake_images = self.generator([real_images, labels], training=True) # 判别器网络判别真实图像和假图像 real_output = self.discriminator([real_images, labels], training=True) fake_output = self.discriminator([fake_images, labels], training=True) # 计算生成器和判别器的损失 g_loss = self.loss_fn(fake_output, tf.ones_like(fake_output)) d_loss_real = self.loss_fn(real_output, tf.ones_like(real_output)) d_loss_fake = self.loss_fn(fake_output, tf.zeros_like(fake_output)) d_loss = d_loss_real + d_loss_fake # 更新生成器和判别器的参数 g_gradients = tape.gradient(g_loss, self.generator.trainable_variables) d_gradients = tape.gradient(d_loss, self.discriminator.trainable_variables) self.g_optimizer.apply_gradients(zip(g_gradients, self.generator.trainable_variables)) self.d_optimizer.apply_gradients(zip(d_gradients, self.discriminator.trainable_variables)) return {"g_loss": g_loss, "d_loss": d_loss} # 创建生成器和判别器 generator = build_generator() discriminator = build_discriminator() # 创建条件对抗网络 cgan = cGAN(generator, discriminator) # 编译条件对抗网络 cgan.compile( g_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), d_optimizer=tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5), loss_fn=tf.keras.losses.BinaryCrossentropy(from_logits=True) ) # 训练条件对抗网络 cgan.fit(dataset, epochs=100) # 使用生成器网络进行图像转换 input_image = ... label = ... output_image = generator([input_image, label]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值