【论文共读】【翻译】【CGAN】【Conditional Gernerative Adversarial Networks】

论文地址:https://arxiv.org/pdf/1411.1784
翻译:
Conditional Gernerative Adversarial Networks
条件生成对抗网络

0. 摘要

生成对抗网络[8]最近被引入,作为一种训练生成模型的新方法。在这项工作中,我们引入了生成对抗网络的条件版本,该网络可以通过简单地输入数据来构建,y,我们希望对生成器和判别器进行条件处理。我们表明,该模型可以生成以类标签为条件的MNIST数字。我们还说明了如何使用该模型来学习多模态模型,并提供了应用于图像标记的初步示例,其中我们演示了这种方法如何生成不属于训练标签的描述性标签。

1. 简介

最近引入了生成对抗网络作为训练生成模型的替代框架,以规避近似许多棘手的概率计算的困难。

对抗网络的优点是永远不需要马尔可夫链,只使用反向传播来获得梯度,在学习过程中不需要推理,并且可以很容易地将各种各样的因素和交互作用纳入模型中。

此外,如[8]所示,它可以产生最先进的对数似然估计和现实样本。

在无条件生成模型中,无法控制所生成数据的模式。但是,通过根据附加信息对模型进行调节,可以指导数据生成过程。这种条件可以基于类标签,基于修复数据的某些部分(如[5]),甚至基于来自不同模态的数据。

在这项工作中,我们展示了如何构建条件对抗网络。对于实证结果,我们展示了两组实验。一个基于类标签的MNIST数字数据集,另一个基于MIR Flickr 25,000数据集[10],用于多模态学习。

2. 相关工作

2.1 图像标注的多模态学习
尽管监督神经网络(尤其是卷积网络)最近取得了许多成功[13,17],但扩展此类模型以适应大量的预测输出类别仍然具有挑战性。第二个问题是,迄今为止的大部分工作都集中在学习从输入到输出的一对一映射上。然而,许多有趣的问题更自然地被认为是概率性的一对多映射。例如,在图像标记的情况下,可能有许多不同的标签可以适当地应用于给定的图像,并且不同的(人类)注释者可能会使用不同的(但通常是同义或相关的)术语来描述相同的图像。

解决第一个问题的一种方法是利用来自其他模态的额外信息:例如,通过使用自然语言语料库来学习标签的向量表示,其中几何关系在语义上是有意义的。当在这样的空间中进行预测时,我们受益于这样一个事实,即当预测错误时,我们仍然经常“接近”事实(例如,预测“桌子”而不是“椅子”),并且我们还受益于这样一个事实,即我们可以自然地对在训练期间看不到的标签进行预测概括。[3]等研究表明,即使是从图像特征空间到词表示空间的简单线性映射也可以提高分类性能。

解决第二个问题的一种方法是使用条件概率生成模型,将输入作为条件变量,并将一对多映射实例化为条件预测分布。

对这个问题采取类似的方法,并在 MIR Flickr 25,000 数据集上训练多模态深度玻尔兹曼机,就像我们在这项工作中所做的那样。

此外,在[12]中,作者展示了如何训练监督多模态神经语言模型,并且他们能够为图像生成描述性句子。

3. 条件对抗网络

3.1 生成对抗网络
生成对抗网络最近被引入,作为一种训练生成模型的新方法。它们由两个“对抗”模型组成:一个生成模型 G,用于捕获数据分布,另一个判别模型 D,用于估计样本来自训练数据而不是 G 的概率。G 和 D 都可以是非线性映射函数,例如多层感知器。

为了学习生成器在数据数据 x 上的分布 pg,生成器从先验噪声分布 pz(z) 到数据空间构建一个映射函数,称为 G(z; θg)。判别器 D(x; θd) 输出一个标量,表示 x 来自训练数据而不是 pg 的概率。

G 和 D 都是同时训练的:我们调整 G 的参数以最小化 log(1 − D(G(z)),调整 D 的参数以最小化 logD(X),就好像它们遵循值函数 V (G, D) 的双人最小-最大博弈一样: 在这里插入图片描述

3.2 有条件对抗网络
如果生成器和判别器都以一些额外信息为条件,则生成对抗网络可以扩展到条件模型,y 可以是任何类型的辅助信息,例如类标签或来自其他模态的数据。我们可以通过将 y 作为额外的输入层输入到鉴别器和生成器中来执行调节。

在生成器中,先验输入噪声 pz(z) 和 y 以联合隐表示的形式组合在一起,对抗训练框架为如何组成这种隐表示提供了相当大的灵活性。1

在判别器中,x 和 y 表示为输入和判别函数(在本例中再次由 MLP 体现)
两人最小值博弈的目标函数为方程 2在这里插入图片描述
图 1 展示了一个简单的条件对抗网络的结构
在这里插入图片描述

4. 实验结果

4.1 单峰
我们在MNIST图像上训练了一个条件对抗网络,这些图像以它们的类标签为条件,编码为一热向量。

在生成器网络中,从单位超立方体内的均匀分布中抽取了维数为 100 的先于 z 的噪声。z 和 y 都通过 ReLu 激活 [4, 11] 映射到隐藏层,层大小分别为 200 和 1000,然后两者都映射到维度为 1200 的第二个组合隐藏 ReLu 层。然后,我们有一个最终的 sigmoid 单元层作为我们的输出,用于生成 784 维 MNIST 样本。

判别器将 x 映射到具有 240 个单元和 5 个单元的 maxout [6] 层,将 y 映射到具有 50 个单元和 5 个单元的 maxout 层。两个隐藏层都映射到具有 240 个单元和 4 个块的联合 maxout 层,然后被馈送到 sigmoid 层。(只要鉴别器具有足够的功率,判别器的精确架构并不重要;我们发现maxout单元通常非常适合这项任务。

该模型使用随机梯度下降法进行训练,小批量大小为 100,初始学习率为 0.1,初始学习率为 0.1,衰减因子为 0.000001衰减因子为 1.00004。此外,动量的初始值为 .5,后来增加到 0.7。概率为 0.5 的 Dropout [9] 被应用于生成器和判别器。在验证集上对数似然的最优估计值作为停止点。

表 1 显示了 MNIST 数据集测试数据的高斯 Parzen 窗口对数似然估计。从每 10 个类别中抽取 1000 个样本,并为这些样本安装了高斯 Parzen 窗口。然后,我们使用 Parzen 窗口分布估计测试集的对数似然。(有关如何构建此估计的更多详细信息,请参见 [8]。

我们提出的条件对抗性净结果与其他一些基于网络的结果相当,但被其他几种方法(包括非条件对抗性网络)所超越。我们将这些结果更多地作为概念验证,而不是功效的证明,并认为随着对超参数空间和架构的进一步探索,条件模型应该匹配或超过非条件结果。
在这里插入图片描述
图 2 显示了一些生成的样本。每行都由一个标签调节,每列都是不同的生成样本。
在这里插入图片描述
4.2 多式联运
像 Flickr 这样的照片网站是以图像及其相关的用户生成的元数据 (UGM) (特别是用户标签)的形式提供的标记数据的丰富来源

用户生成的元数据与更“规范”的图像标记策略不同,因为它们通常更具描述性,并且在语义上更接近人类使用自然语言描述图像的方式,而不仅仅是识别图像中存在的对象。UGM 的另一个方面是同义词很普遍,不同的用户可能会使用不同的词汇来描述相同的概念——因此,有一种有效的方法来规范化这些标签变得很重要。概念词嵌入[14]在这里非常有用,因为相关概念最终由相似的向量表示。

在本节中,我们将演示使用多标签预测自动标记图像,使用条件对抗网络生成以图像特征为条件的标签向量分布(可能是多模态)。

对于图像特征,我们在具有 21,000 个标签 [15] 的完整 ImageNet 数据集上预训练了一个类似于 [13] 中的卷积模型。我们使用最后一个具有 4096 个单元的全连接层的输出作为图像表示。

对于世界表示,我们首先从YFCC100M 2 个数据集元数据中收集用户标签、标题和描述的串联文本语料库。在对文本进行预处理和清理后,我们训练了一个词向量大小为 200 的 skip-gram 模型 [14]。我们省略了词汇表中出现次数少于 200 次的任何单词,从而最终得到一本大小为 247465 的词典。

在对抗网络的训练过程中,我们保持卷积模型和语言模型的固定。当我们甚至通过这些模型反向传播时,将实验留作未来的工作。

在我们的实验中,我们使用 MIR Flickr 25,000 数据集 [10],并使用我们上面描述的卷积模型和语言模型提取图像和标签特征。我们的实验中省略了没有任何标签的图像,注释被视为额外的标签。前 150,000 个样本被用作训练集。在训练集中,对于每个关联标签,具有多个标签的图像重复一次。

为了进行评估,我们为每个图像生成 100 个样本,并使用词汇表中单词向量表示的余弦相似性找到每个样本中最接近的前 20 个单词。然后,我们从所有 100 个样本中选择前 10 个最常见的单词。表 4.2 显示了用户分配的标签和注释的一些样本以及生成的标签。

最佳工作模型的生成器接收大小为 100 的高斯噪声作为先验噪声,并将其映射到 500 维的 ReLu 层。并将4096维图像特征向量映射到2000维ReLu隐藏层。这两个层都映射到 200 维线性层的联合表示,该线性层将输出生成的词向量。

判别器分别由500维和1200维的ReLu隐藏层组成,分别用于词向量和图像特征,以及以1000个单元和3个块的maxout层作为连接层,最终被馈送到一个单一的sigmoid单元。

该模型使用随机梯度下降法进行训练,小批量大小为 100,初始学习率为 0.1,初始学习率为 0.1,衰减因子为 0.000001衰减因子为 1.00004。此外,动量的初始值为 .5,后来增加到 0.7。对生成器和鉴别器都应用了概率为 0.5 的丢弃。

超参数和架构选择是通过交叉验证以及随机网格搜索和手动选择的混合获得的(尽管搜索空间有限)。

5. 今后的工作

本文展示的结果是非常初步的,但它们证明了条件对抗网络的潜力,并显示出有趣和有用的应用前景。

从现在到研讨会的未来探索中,我们期望展示更复杂的模型,以及对其性能和特征的更详细和深入的分析。在这里插入图片描述
此外,在当前的实验中,我们只单独使用每个标签。但是,通过同时使用多个标签(有效地将生成问题作为“集合生成”的问题之一),我们希望获得更好的结果。

留给未来工作的另一个明显方向是构建一个联合训练计划来学习语言模型。像[12]这样的研究表明,我们可以学习适合特定任务的语言模型。

致谢
这个项目是在 Pylearn2 [7] 框架下开发的,我们要感谢 Pylearn2 的开发者。我们还要感谢伊恩·古德费罗(Ian Goodfellow)在蒙特利尔大学任职期间进行的有益讨论。作者感谢Flickr的视觉与机器学习和生产工程团队的支持(按字母顺序排列:Andrew Stadlen、Arel Cordero、Clayton Mellina、Cyprien Noel、Frank Liu、Gerry Pesavento、Huy Nguyen、Jack Culpepper、John Ko、Pierre Garrigues、Rob Hess、Stacey Svetlichnaya、Tobi Baumgartner和Ye Lu)。

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值